scrapy 2.3 XMLFeedSpider
- class
scrapy.spiders.
XMLFeedSpider
-
XMLFeedSpider是为解析XML提要而设计的,它通过使用特定的节点名对这些提要进行迭代。迭代器可以从以下选项中选择:
iternodes
,xml
和html
. 建议使用iternodes
由于性能原因,迭代器xml
和html
迭代器一次生成整个DOM以便解析它。然而,使用html
因为迭代器在分析带有错误标记的XML时可能很有用。要设置迭代器和标记名,必须定义以下类属性:
iterator
-
定义要使用的迭代器的字符串。它可以是:
-
'iternodes'
-基于正则表达式的快速迭代器 -
'html'
-使用的迭代器 Selector
. 请记住,这使用了DOM解析,必须将所有的DOM加载到内存中,这对于大型提要来说可能是一个问题。 -
'xml'
-使用的迭代器 Selector
. 请记住,这使用了DOM解析,必须将所有的DOM加载到内存中,这对于大型提要来说可能是一个问题。
默认为:
'iternodes'
. -
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
(response, selector)-
对与提供的标记名匹配的节点调用此方法 (
itertag
)接收响应和 Selector
对于每个节点。重写此方法是必需的。否则,你的蜘蛛就不能工作了。此方法必须返回 item object ,A Request
对象,或包含任何对象的iterable。
警告
由于其内部实现,在编写时必须显式设置新请求的回调 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
.