2014-11-23 57 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