Scrapy - 普通的Spider(二)

XMLFeedSpider

這個Spider是用於解析XML的,它可以通過指定的節點迭代的解析XML。迭代器可以選擇iternodes,xml或html。由於xml和html都需要一次性讀取整個DOM然後才能解析XML,這樣會有性能的問題,所以推薦使用iternodes迭代器。但是當解析有錯誤標記的XML時,使用html迭代器會有些幫助。
使用XMLFeedSpider必須定義以下類屬性來設置迭代器和標籤名:
iterator
使用的迭代器。它的值可以是:
- ‘iternodes’ - 基於正則表達式的一個快速的迭代器。
- ‘html’ - 使用Selector的一個迭代器。它使用的是DOM解析,必須將所有的DOM載入內存中,這樣對比較大的XML可能會是一個問題。
- ‘xml’ - 使用Selector的一個迭代器。它使用的是DOM解析,必須將所有的DOM載入內存中,這樣對比較大的XML可能會是一個問題。
默認的值是iternodes。

itertag
將要迭代的節點(或元素)的名字。如:

itertag = 'product'

namespaces
一個(prefix, uri)的元組,定義了Spider將處理的文件中可以使用的命名空間。元組中的prefix和uri會使用register_namespace方法自動註冊命名空間。
itertag屬性的值可以使用指定節點(或元素)的命名空間來賦值。如:

class YourSpider(XMLFeedSpider):
    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
    itertag = 'n:url'
    # ...

除了這些新屬性,還有以下可以重寫的方法:
adapt_response(response)
在Spider開始解析response之前,當response從Spider的中間件剛返回時,接收response的一個方法。可以用來在解析response之前修改response的內容,該方法必須返回一個response。

parse_node(response, selector)
對與提供的標籤名匹配的節點(或元素)調用該方法。接收response和Selector,必須重寫這個方法,不然Spider不會工作。該方法必須返回一個Item對象或Request對象或包含前兩者任意一個的可迭代對象。

**process_results(response, results)
對Spider返回的每一個結果(Item或request)調用該方法,其目的是在結果返回給框架的核心之前做最後的處理,例如設置item的ID。它接收結果的列表和response,必須返回一個結果的列表(Items或Requests)
Example:

from scrapy.spiders import XMLFeedSpider
from myproject.items import TestItem

class MySpider(XMLFeedSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/feed.xml']
    iterator = 'iternodes' # This is actually unnecessary, since it's the default value
    itertag = 'item'

    def parse_node(self, response, node):
        self.logger.info('Hi, this is a <%s> node!: %s', self.itertag, ''.join(node.extract()))
        item = TestItem()
        item['id'] = node.xpath('@id').extract()
        item['name'] = node.xpath('name').extract()
        item['description'] = node.xpath('description').extract()
        return item
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章