2016-11-28 2 views
0

Mit der Python-Bibliothek Scrapy, ich folgend:Wie bekomme ich Link-Text von diesem XPath?

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" 

Von dort würde ich einzelnen Link + Text jeden zurückgegebenen Artikel bekommen:

response.xpath('//div[@class="title-and-desc"]/a') 

Allerdings werden nur Links zurückgegeben und nicht text. Hier ist ein Beispiel von dem, was zurückgegeben:

response.xpath('//div[@class="title-and-desc"]/a') 
[<Selector xpath='//div[@class="title-and-desc"]/a' data=u'<a target="_blank" href="http://www.brpr'>, <Selector xpath='//div[@class="title-and-desc"]/a' data=u'<a target="_blank" href="http://www.dive'>, <Selector xpath='//div[@class="title-and-desc"]/a' data=u'<a target="_blank" href="http://rhodesmi'>, 

kann ich Schleife durch die obigen Ergebnisse, wo i ist die Variable für jede Iteration:

i.xpath("text()").extract_first(), 
i.xpath("@href").extract_first() 

Aber nur die @href Werte zurückgegeben werden. Das macht da seit text() nichts in den Ergebnissen abzurufen. Was muss geändert werden, damit ich auch den begleitenden Linktext bekommen kann?

Als Referenz kommt das vollständige Scrapy-Beispiel von hier: Scrapy Tutorial Example.

Antwort

0

Es ist, weil der Text die Sie suchen, in dem untergeordneten Knoten ist div:

<div class="title-and-desc"> 
    <a target="_blank" href="http://www.network-theory.co.uk/python/intro/"> 
    <div class="site-title">An Introduction to Python </div> 
    </a> 
<div> 

Sie den gesamten Text eines Knotens erhalten können (mit dem Text davon Kinder) durch // es vorangestellt, das heißt //text() anstelle von text() oder gehen Sie einfach mit expliziten xpath a/div/text().

Versuchen:

links = response.xpath('//div[@class="title-and-desc"]/a') 
for l in links: 
    # url: 
    print(l.xpath('@href').extract_first()) 
    # text with explicit xpath: 
    print(l.xpath('div/text()').extract_first()) 
    # or with all text elements with relative //text: 
    print(''.join(l.xpath('.//text()').extract()).strip()) 
+0

Das ist nicht das Problem löst, da nur Text immer bedeutet nicht die URLs zu bekommen. Ich habe versucht "i.xpath (" // text() "). Extract_first()' aber das hat nicht funktioniert. – 4thSpace

+0

@ 4thSpace es funktioniert, siehe meine Bearbeitung für ein Beispiel. – Granitosaurus

+1

Eine weitere nützliche Option ist die Verwendung von XPaths 'string()' oder 'normalize-space()': 'für l in Verknüpfungen: print (l.xpath ('normalize-space (.)'). Extract_first(), l. xpath ('@ href') .xtract_first()) ' –

Verwandte Themen