使用XPath从超链接中提取文本

时间:2014-11-23 14:30:39

标签: python html xpath scrapy

我正在使用Python和Xpath来刮掉Reddit。目前我在头版工作。我试图从其首页提取链接并在shell中显示它们的标题。

为此,我使用的是Scrapy框架。我正在Scrapy shell中测试它。

我的问题是:如何从<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>

如何提取文本字符串?

2 个答案:

答案 0 :(得分:1)

仅使用在线XPath评估程序对其进行测试,但在将其调整为

时应该可以使用它
response.xpath('//p/descendant::a[contains(@class,"title")]/text()')

如果您正在评估//p[descendant::a[contains(@class,"title")]]/text(),则<p>(带有后代<a>)是当前元素,而不是<a>

答案 1 :(得分:1)

如果<p><a>处于这种情况:

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

这会给你“ABC”:

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

//等于使用descendantsp[descendant::a]不会给您结果,因为您没有将<a>视为<p>的后代