2016-08-18 2 views
0

Ich kratze eine Wikipedia-Seite, um alle Bild-URLs zu extrahieren und hier ist der Code dafür.Warum ignoriert restrict_xpath hrefs innerhalb von <a> Tags?

from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 

class WikiSpider(CrawlSpider): 
    name = 'wiki' 
    allowed_domains = ['en.wikipedia.org'] 
    start_urls = ['https://en.wikipedia.org/wiki/Katy_Perry'] 

    rules = [Rule(LinkExtractor(restrict_xpaths=('//a[@class="image"]')), 
      callback='parse_item', follow=False),] 

    def parse_item(self, response): 
     print(response.url) 

Wenn ich die Spinne laufen, es zeigt keine Ergebnisse, aber wenn ich den XPath innerhalb restrict_xpaths ändern druckt es einige zufällige Links. Ich brauche hrefs in der xpath '//a[@class="image"]' aber es funktioniert nicht, was ist der Grund? Ich weiß, dass ich Basic Spider anstelle von verwenden und Regeln ganz vermeiden könnte. Aber ich möchte wissen, warum der XPath, den ich eingegeben habe, nicht funktioniert hat und welche Art von XPaths und HTML-Tags akzeptiert restrict_xpaths?

Antwort

2

Die Links Sie sind Bilder:

$ scrapy shell "https://en.wikipedia.org/wiki/Katy_Perry" -s USER_AGENT='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36' 
2016-08-19 11:17:05 [scrapy] INFO: Scrapy 1.1.2 started (bot: scrapybot) 
(...) 
2016-08-19 11:17:06 [scrapy] DEBUG: Crawled (200) <GET https://en.wikipedia.org/wiki/Katy_Perry> (referer: None) 
(...) 
In [1]: response.xpath('//a[@class="image"]/@href').extract() 
Out[1]: 
['/wiki/File:Katy_Perry_DNC_July_2016_(cropped).jpg', 
'/wiki/File:Katy_Perry_performing.jpg', 
'/wiki/File:Katy_Perry%E2%80%93Zenith_Paris.jpg', 
'/wiki/File:PWT_Cropped.jpg', 
'/wiki/File:Alanis_Morissette_5-19-2014.jpg', 
'/wiki/File:Freddie_Mercury_performing_in_New_Haven,_CT,_November_1977.jpg', 
'/wiki/File:Katy_Perry_California_Dreams_Tour_01.jpg', 
'/wiki/File:Katy_Perry_UNICEF_2012.jpg', 
'/wiki/File:Katy_Perry_Hillary_Clinton,_I%27m_With_Her_Concert.jpg', 
'/wiki/File:Wikiquote-logo.svg', 
'/wiki/File:Commons-logo.svg'] 

Und durch Extraktoren Standard-Link a lot of extensions filtern, einschließlich Bilder:

In [2]: from scrapy.linkextractors import LinkExtractor 

In [3]: LinkExtractor(restrict_xpaths=('//a[@class="image"]')).extract_links(response) 
Out[3]: [] 

Sie können use deny_extensions=[] nichts filtern:

In [4]: LinkExtractor(restrict_xpaths=('//a[@class="image"]'), deny_extensions=[]).extract_links(response) 
Out[4]: 
[Link(url='https://en.wikipedia.org/wiki/File:Katy_Perry_DNC_July_2016_(cropped).jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Katy_Perry_performing.jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Katy_Perry%E2%80%93Zenith_Paris.jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:PWT_Cropped.jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Alanis_Morissette_5-19-2014.jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Freddie_Mercury_performing_in_New_Haven,_CT,_November_1977.jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Katy_Perry_California_Dreams_Tour_01.jpg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Katy_Perry_UNICEF_2012.jpg', text='', fragment='', nofollow=False), 
Link(url="https://en.wikipedia.org/wiki/File:Katy_Perry_Hillary_Clinton,_I'm_With_Her_Concert.jpg", text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Wikiquote-logo.svg', text='', fragment='', nofollow=False), 
Link(url='https://en.wikipedia.org/wiki/File:Commons-logo.svg', text='', fragment='', nofollow=False)] 
+0

Vielen Dank. Ich benutze fast nie Debugger und jetzt weiß ich, wie man es richtig benutzt. –

+0

Scrapy Shell ist nicht wirklich ein Debugger, aber es ist einer Ihrer besten Freunde in Scrapy-Projekten. –

+0

Nur aus Neugier, ich habe versucht, Image-Link von 'src' Attribut innerhalb' img' Tag wie dieser 'LinkExtractor (restrict_xpaths = ('// img'), deny_extensions = []) .extract_links (response)' zu greifen. Dann habe ich den "attrs" -Parameter in "src" geändert, wie dies "LinkExtractor" (restrict_xpaths = ('// img'), deny_extensions = [], attrs = ('src')). Extract_links (response) ', beide leere Liste zurückgeben. Ich weiß, es ist alles unnötig, aber akzeptiert 'restrict_xpath' kein Tag oder habe ich etwas falsch gemacht? –

Verwandte Themen