7

誰かがSgmlLinkExtractor/CrawlSpiderを使用してRSSアイテムリンクを抽出/フォローしようとしたことがあるかどうか疑問に思いました。動作させられません...

私は次のルールを使用しています:

   ルール=(
       Rule(SgmlLinkExtractor(tags =('link'、)、attrs = False)、
           follow = True、
           callback ='parse_article')、
       )。

(rssリンクはlinkタグにあることに注意してください)。

リンクのtext()を抽出し、属性を検索しないようにSgmlLinkExtractorに指示する方法がわかりません...

どんな助けでも大歓迎です、よろしくお願いします

4

4 に答える 4

7

CrawlSpiderルールはそのようには機能しません。BaseSpiderをサブクラス化し、スパイダーコールバックに独自のリンク抽出を実装する必要があります。例えば:

from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.selector import XmlXPathSelector

class MySpider(BaseSpider):
    name = 'myspider'

    def parse(self, response):
        xxs = XmlXPathSelector(response)
        links = xxs.select("//link/text()").extract()
        return [Request(x, callback=self.parse_link) for x in links]

たとえば、次のコマンドを実行して、シェルでXPathを試すこともできます。

scrapy shell http://blog.scrapy.org/rss.xml

そして、シェルに入力します。

>>> xxs.select("//link/text()").extract()
[u'http://blog.scrapy.org',
 u'http://blog.scrapy.org/new-bugfix-release-0101',
 u'http://blog.scrapy.org/new-scrapy-blog-and-scrapy-010-release']
于 2010-09-19T20:29:13.113 に答える
6

XMLFeedSpider最近使えるものがあります。

于 2013-04-19T12:17:02.617 に答える
0

私はCrawlSpiderを使用してそれを行いました:

class MySpider(CrawlSpider):
   domain_name = "xml.example.com"

   def parse(self, response):
       xxs = XmlXPathSelector(response)
       items = xxs.select('//channel/item')
       for i in items: 
           urli = i.select('link/text()').extract()
           request = Request(url=urli[0], callback=self.parse1)
           yield request

   def parse1(self, response):
       hxs = HtmlXPathSelector(response)
       # ...
       yield(MyItem())

しかし、それが非常に適切な解決策であるかどうかはわかりません...

于 2010-10-01T21:55:33.630 に答える
-2

ScrapyDocからのXMLの例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.extract()))

        #item = TestItem() 
        item = {} # change to dict for removing the class not found error
        item['id'] = node.xpath('@id').extract()
        item['name'] = node.xpath('name').extract()
        item['description'] = node.xpath('description').extract()
        return item
于 2016-08-15T03:09:49.690 に答える