2013-03-03 13 views
5

Bir web sitesinin RSS akışlarını taramak ve ardından makalenin meta etiketlerini ayrıştırmak için bir tarama örümceği programlamaya çalışıyorum.Kurallar nasıl düzgün kullanılır ?, scrub ile URL'leri taramak ve ayrıştırmak için restrict_xpaths?

İlk RSS sayfası, RSS kategorilerini görüntüleyen bir sayfadır. Etiketi etiket içinde olduğu için bağlantıyı almayı başardım. Bu şuna benzer: Sen XPath ile bağlantıyı alabilirsiniz görebileceğiniz gibi

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

: size böyle görünüyor RSS kategorisi için makaleler getirdiği bağlantıyı tıkladıktan sonra

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

Yine etiketini kullanırsam tarayıcımın bu etiketin içindeki bağlantıya gitmesini ve meta etiketleri benim için ayrıştırmasını istiyorum.

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) 

yanlış Burada ne işim: Ben tarayıcımızın çalıştırdığınızda Ancak bu çıkış olduğunu

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 

: Burada

benim paletli kodudur? Belgeleri tekrar tekrar okuyorum ama bir şeylere bakmaya devam ediyorum. Herhangi bir yardım takdir edilecektir.

DÜZENLEME: Eklenme: items.append (item). Orijinal yazıyla unutmuştu. DÜZENLEME:: Bunu da ben denedim ve aynı çıkışı ile sonuçlanmıştır: Boş items iade

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

Kurallarını düzenlemeye çalışmıştım: Kural (SgmlLinkExtractor (allow = [r '. *'], Restrict_xpaths = ('// td [@ class = "xmlLink"]')), aşağıdaki = True), Kural (SgmlLinkExtractor (= [r'. * '] izin restrict_xpaths = (' // h4 [sınıf @ = "itemTitle"] ')), geri =' parse_articles') Ama yine de, aynı sonuçlandı çıktı. – Marc

+0

Merhaba Marc: Bu sorunu nasıl çözdün? Scrapy örneklerini çalıştırdığımda her şey tamam ve projemize mantık uygulandığında kuralların asla ortaya çıkmayacağı anlaşılıyor ... – hugsbrugs

+0

sadece örümceğinizi “scrapy.pider” den kurtarıyor. – lhe

cevap

2

, sen items için item eklemek gerekir.
Döngüye yield item da ekleyebilirsiniz.

+0

Evet, haklısın "items.append (item)" yazısının içine koymayı unuttum. Ancak yine de bana aynı çıktıyı veriyor. Şimdi bir düzenleme yapacağım. – Marc