2010-05-30 22 views
7

Tôi đã tự hỏi liệu có ai đã từng trích xuất/theo các liên kết mục RSS bằng cách sử dụng SgmlLinkExtractor/CrawlSpider hay không. Tôi không thể có được nó để làm việc ...Phế liệu - Theo các liên kết RSS

Tôi đang sử dụng các nguyên tắc sau:

 

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

(có trong tâm trí rằng các liên kết rss nằm trong liên kết thẻ).

Tôi không chắc chắn làm thế nào để nói với SgmlLinkExtractor để trích xuất văn bản() của liên kết và không để tìm kiếm các thuộc tính ...

Bất kỳ trợ giúp được chào đón, Cảm ơn trước

Trả lời

7

quy tắc CrawlSpider không làm việc theo cách đó. Bạn có thể cần phải phân lớp BaseSpider và thực hiện khai thác liên kết của riêng bạn trong gọi lại spider của bạn. Ví dụ:

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] 

Bạn cũng có thể thử các XPath trong vỏ, bằng cách chạy ví dụ:

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

Và sau đó gõ vào vỏ:

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

bạn có thể xin giải thích sự khác biệt giữa việc sử dụng quy tắc CrawlSpider và thực hiện khai thác liên kết tùy chỉnh trên gọi lại? Tôi đã đấu tranh một lúc để bắt được sự khác biệt, và sau vài lần đọc tài liệu ... vẫn không có gì. Tôi đang đi với phương pháp của bạn vì một kinh nghiệm quá khứ xấu bằng cách sử dụng các quy tắc, nhưng tôi chỉ muốn biết chính xác lý do tại sao. T.I.A – romeroqj

+1

Có một ['' 'XMLFeedSpider'''] (https://scrapy.readthedocs.org/en/latest/topics/spiders.html?highlight=rule#xmlfeedspider-example) người ta có thể sử dụng hiện nay. – opyate

0

Tôi đã thực hiện nó sử dụng 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()) 

nhưng tôi không chắc chắn đó là một giải pháp rất thích hợp ...

6

Có một XMLFeedSpider người ta có thể sử dụng hiện nay.

+0

Đối với ngày hôm nay nó là giải pháp tốt hơn. +1 – Jon

-1

XML Ví dụ Từ 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 
Các vấn đề liên quan