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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章