Wie ordnungsgemäß verwenden Regeln, beschränken_xpaths zu crawlen und analysieren URLs mit scrapy?

Ich versuche, eine Crawl-Spinne zu programmieren, um RSS-Feeds einer Website zu crawlen und dann die Meta-Tags des Artikels zu analysieren.

Die erste RSS-Seite ist eine Seite, die die RSS-Kategorien anzeigt. Ich habe es geschafft, den Link zu extrahieren, weil das Tag in einem Tag ist. Es sieht aus wie das:

<tr> <td class="xmlLink"> <a href="http://feeds.example.com/subject1">subject1</a> </td> </tr> <tr> <td class="xmlLink"> <a href="http://feeds.example.com/subject2">subject2</a> </td> </tr> 

Sobald Sie auf diesen Link klicken, bringt es Ihnen die Artikel für diese RSS-Kategorie, die so aussieht:

  <li class="regularitem"> <h4 class="itemtitle"> <a href="http://example.com/article1">article1</a> </h4> </li> <li class="regularitem"> <h4 class="itemtitle"> <a href="http://example.com/article2">article2</a> </h4> </li> 

Wie Sie sehen können, kann ich den Link mit xpath wieder bekommen, wenn ich das Tag verwende Ich möchte, dass mein Crawler auf den Link innerhalb dieses Tags zu gehen und die Meta-Tags für mich zu analysieren.

Hier ist mein Crawler-Code:

 from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from tutorial.items import exampleItem class MetaCrawl(CrawlSpider): name = 'metaspider' start_urls = ['http://example.com/tools/rss'] # urls from which the spider will start crawling rules = [Rule(SgmlLinkExtractor(restrict_xpaths=('//td[@class="xmlLink"]')), follow=True), Rule(SgmlLinkExtractor(restrict_xpaths=('//h4[@class="itemtitle"]')), callback='parse_articles')] def parse_articles(self, response): hxs = HtmlXPathSelector(response) meta = hxs.select('//meta') items = [] for m in meta: item = exampleItem() item['link'] = response.url item['meta_name'] =m.select('@name').extract() item['meta_value'] = m.select('@content').extract() items.append(item) return items 

Allerdings ist dies die Ausgabe, wenn ich den Crawler laufen:

 DEBUG: Crawled (200) <GET http://http://feeds.example.com/subject1> (referer: http://example.com/tools/rss) DEBUG: Crawled (200) <GET http://http://feeds.example.com/subject2> (referer: http://example.com/tools/rss) 

Was mache ich hier falsch? Ich habe die Dokumentation immer wieder gelesen, aber ich habe das Gefühl, dass ich etwas übersehen werde. Jede Hilfe wäre willkommen.

EDIT: Hinzugefügt: items.append (item). Hatte es in der ursprünglichen Post vergessen. EDIT:: Ich habe das auch so ausprobiert und es kam zu der gleichen Ausgabe:

 from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from reuters.items import exampleItem from scrapy.http import Request class MetaCrawl(CrawlSpider): name = 'metaspider' start_urls = ['http://example.com/tools/rss'] # urls from which the spider will start crawling rules = [Rule(SgmlLinkExtractor(allow=[r'.*',], restrict_xpaths=('//td[@class="xmlLink"]')), follow=True), Rule(SgmlLinkExtractor(allow=[r'.*'], restrict_xpaths=('//h4[@class="itemtitle"]')),follow=True),] def parse(self, response): hxs = HtmlXPathSelector(response) meta = hxs.select('//td[@class="xmlLink"]/a/@href') for m in meta: yield Request(m.extract(), callback = self.parse_link) def parse_link(self, response): hxs = HtmlXPathSelector(response) meta = hxs.select('//h4[@class="itemtitle"]/a/@href') for m in meta: yield Request(m.extract(), callback = self.parse_again) def parse_again(self, response): hxs = HtmlXPathSelector(response) meta = hxs.select('//meta') items = [] for m in meta: item = exampleItem() item['link'] = response.url item['meta_name'] = m.select('@name').extract() item['meta_value'] = m.select('@content').extract() items.append(item) return items 

One Solution collect form web for “Wie ordnungsgemäß verwenden Regeln, beschränken_xpaths zu crawlen und analysieren URLs mit scrapy?”

Sie haben eine leere items , müssen Sie item an items anfügen.
Sie können auch yield item in der Schleife.

  • Extrahieren von Tabellen aus einem DOCX Word Dokument in Python
  • Python lxml XPath Problem
  • Wie selektiere ich Elemente in einem iframe mit Xpath?
  • Einen bestimmten Attributwert mit XPath erhalten
  • Wie bekomme ich den kompletten Inhalt eines Knotens mit xpath & lxml?
  • Scrapy xpath selecter wiederholt Daten
  • Parsing XPath in Nicht-Standard-XML mit lxml Python
  • Wie man eine Variable in xpath python
  • Cant Scrape Webseite mit Python Requests Library
  • Kratzen neuer ESPN-Site mit xpath [Python]
  • Xpath-Lookup über lxml beginnend von root anstatt element
  • Python ist die beste Programmiersprache der Welt.