scrapy 2.3 XMLFeedSpider

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

XMLFeedSpider是為解析XML提要而設計的,它通過使用特定的節(jié)點名對這些提要進行迭代。迭代器可以從以下選項中選擇: iternodes , xml 和 html . 建議使用 iternodes 由于性能原因,迭代器 xml 和 html 迭代器一次生成整個DOM以便解析它。然而,使用 html 因為迭代器在分析帶有錯誤標記的XML時可能很有用。

要設置迭代器和標記名,必須定義以下類屬性:

iterator

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

  • 'iternodes' -基于正則表達式的快速迭代器

  • 'html' -使用的迭代器 ?Selector? . 請記住,這使用了DOM解析,必須將所有的DOM加載到內存中,這對于大型提要來說可能是一個問題。

  • 'xml' -使用的迭代器 ?Selector? . 請記住,這使用了DOM解析,必須將所有的DOM加載到內存中,這對于大型提要來說可能是一個問題。

默認為: 'iternodes' .

itertag

具有要迭代的節(jié)點(或元素)名稱的字符串。例子::

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)

對與提供的標記名匹配的節(jié)點調用此方法 (itertag )接收響應和 ?Selector? 對于每個節(jié)點。重寫此方法是必需的。否則,你的蜘蛛就不能工作了。此方法必須返回 item object ,A  ?Request?  對象,或包含任何對象的iterable。

process_results(responseresults)

這個方法是為spider返回的每個結果(項或請求)調用的,它用于在將結果返回到框架核心之前執(zhí)行所需的任何最后一次處理,例如設置項id。它接收結果列表和產生這些結果的響應。它必須返回結果列表(項或請求)。

警告

由于其內部實現(xiàn),在編寫時必須顯式設置新請求的回調 XMLFeedSpider -基于蜘蛛;否則會發(fā)生意外行為。

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

基本上,我們所做的就是創(chuàng)建一個蜘蛛,從給定的 ?start_urls? ,然后遍歷 ?item? 標簽,打印出來,并將一些隨機數(shù)據(jù)存儲在 ?Item? .


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號