Frage

Ich habe mich gefragt, ob jemand jemals zu extrahieren versucht, / folgen Verbindungen RSS Punkt mit SgmlLinkExtractor / CrawlSpider. Ich kann es nicht an der Arbeit ...

Ich verwende die folgende Regel:

   rules = (
       Rule(SgmlLinkExtractor(tags=('link',), attrs=False),
           follow=True,
           callback='parse_article'),
       )

(unter Berücksichtigung der Tatsache, dass RSS-Links befinden sich im link -Tag).

Ich bin nicht sicher, wie SgmlLinkExtractor zu sagen, um den Text zu extrahieren () von die Verbindung und nicht die Attribute zu suchen ...

Jede Hilfe ist willkommen, Vielen Dank im Voraus

War es hilfreich?

Lösung

CrawlSpider Regeln funktionieren nicht auf diese Weise. Sie müssen wahrscheinlich BaseSpider Unterklasse und Ihre eigene Link-Extraktion in Ihrer Spinne Rückruf zu implementieren. Zum Beispiel:

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]

Sie kann auch versuchen, die XPath in der Schale, durch zum Beispiel ausgeführt werden:

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

Und dann in der Shell eingeben:

>>> 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']

Andere Tipps

Es gibt eine XMLFeedSpider kann man heutzutage verwendet werden.

Ich habe es getan CrawlSpider mit:

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

, aber ich bin nicht sicher, dass eine sehr richtige Lösung ist ...

XML-Beispiel Aus scrapy doc 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top