scrapy 2.3 XMLFeedSpider

2021-06-09 10:07 更新
classscrapy.spiders.XMLFeedSpider

XMLFeedSpider是为解析XML提要而设计的,它通过使用特定的节点名对这些提要进行迭代。迭代器可以从以下选项中选择: iternodes , xml 和 html . 建议使用 iternodes 由于性能原因,迭代器 xml 和 html 迭代器一次生成整个DOM以便解析它。然而,使用 html 因为迭代器在分析带有错误标记的XML时可能很有用。

要设置迭代器和标记名,必须定义以下类属性:

iterator

定义要使用的迭代器的字符串。它可以是:

  • 'iternodes' -基于正则表达式的快速迭代器

  • 'html' -使用的迭代器 ​Selector​ . 请记住,这使用了DOM解析,必须将所有的DOM加载到内存中,这对于大型提要来说可能是一个问题。

  • 'xml' -使用的迭代器 ​Selector​ . 请记住,这使用了DOM解析,必须将所有的DOM加载到内存中,这对于大型提要来说可能是一个问题。

默认为: 'iternodes' .

itertag

具有要迭代的节点(或元素)名称的字符串。例子::

itertag = 'product'
namespaces

列表 (prefix, uri) 定义该文档中可用的命名空间的元组,这些命名空间将使用此蜘蛛进行处理。这个 prefix 和 uri 将用于使用 ​register_namespace()​ 方法。

然后,可以在 ​itertag​ 属性。

例子:

class YourSpider(XMLFeedSpider):

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

除了这些新属性之外,这个蜘蛛还具有以下可重写的方法:

adapt_response(response)

一种方法,当响应从蜘蛛中间件到达时,在蜘蛛开始解析它之前,立即接收响应。它可以用于在解析响应体之前对其进行修改。此方法接收响应并返回响应(可以是相同的或另一个响应)。

parse_node(responseselector)

对与提供的标记名匹配的节点调用此方法 (itertag )接收响应和 ​Selector​ 对于每个节点。重写此方法是必需的。否则,你的蜘蛛就不能工作了。此方法必须返回 item object ,A  ​Request​  对象,或包含任何对象的iterable。

process_results(responseresults)

这个方法是为spider返回的每个结果(项或请求)调用的,它用于在将结果返回到框架核心之前执行所需的任何最后一次处理,例如设置项id。它接收结果列表和产生这些结果的响应。它必须返回结果列表(项或请求)。

警告

由于其内部实现,在编写时必须显式设置新请求的回调 XMLFeedSpider -基于蜘蛛;否则会发生意外行为。

XmlFeedSpider示例

这些蜘蛛很容易使用,让我们来看一个例子:

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.getall()))

        item = TestItem()
        item['id'] = node.xpath('@id').get()
        item['name'] = node.xpath('name').get()
        item['description'] = node.xpath('description').get()
        return item

基本上,我们所做的就是创建一个蜘蛛,从给定的 ​start_urls​ ,然后遍历 ​item​ 标签,打印出来,并将一些随机数据存储在 ​Item​ .


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号