2014-11-23 53 views
0

我正在使用Python和Xpath一起抓取Reddit。目前我正在首頁上工作。我試圖從頭版中提取鏈接並在shell中顯示它們的標題。使用XPath從超鏈接中提取文本

爲此,我使用Scrapy框架。我正在Scrapy殼本身測試這個。

我的問題是:我如何從<a> ABC </a>屬性中提取文本。我想要字符串「ABC」。我找不到它。我嘗試了以下表達式,但它似乎不起作用。

response.xpath('//p[descendant::a[contains(@class,"title")]]/@value')

response.xpath('//p[descendant::a[contains(@class,"title")]]/@data')

response.xpath('//p[descendant::a[contains(@class,"title")]]').extract()

response.xpath('//p[descendant::a[contains(@class,"title")]]/text()')

他們都不似乎工作。當我使用extract()時,它給了我整個屬性本身。例如,而不是給我ABC,它會給我<a>ABC</a>

如何提取文本字符串?

回答

1

如果<p><a>是在這種情況下:

<p> 
    <something> 
     <a class="title">ABC</a> 
    </something> 
</p> 

這會給你一個 「ABC」:

>>print response.xpath('//p//a[@class="title"]/text()').extract()[0] 
ABC 

//等於使用descendants的。 p[descendant::a]將不會給你結果,因爲你不考慮<a>作爲<p>的後裔

+0

這是我犯的錯誤! – 2014-11-24 02:12:37

1

只有在線XPath計算器測試,但如果你正在評估//p[descendant::a[contains(@class,"title")]]/text()它應該工作的時候,你調整到

response.xpath('//p/descendant::a[contains(@class,"title")]/text()') 

,該<p>(與後代<a>)是當前元素,而不是<a>

+0

你沒有在'.xpath()'函數中錯過''''。因爲像這樣你會有語法錯誤。 – 2014-11-23 21:49:06

+0

@NimaSoroush感謝提及;對於我從OP調整'.xpath()'的答案,只測試了xpath表達式,而不是函數。剛剛糾正了。 – 2014-11-23 22:13:22