python xpath根据span文本提取文本外部标记

时间:2018-02-23 15:54:04

标签: python html xpath scrapy

我想提取标签外的文本,并将其与范围内的文本进行匹配。

这是代码:

<div class="info">
    <p>
        <i class="icon-trending-up"></i>
        <span>Rank:</span>
        600
    </p>
    <p>
        <i class="icon-play"></i>
        <span>Total Videos:</span>
        36
    </p>
    <p>
        <i class="icon-bar-chart"></i>
        <span>Video Views:</span>
        1,815,767
    </p>
    <hr>
    <p>
        <i class="icon-user-plus"></i>
        <span>Followers:</span>
        732
    </p>
</div>

我想在单独的项目中提取这样的内容。

item['rank'] = rank

Rank: 600

item['videos'] = videos

Total Videos: 36

item['views'] = views 

Video Views: 1,815,767

我不想要&lt; p &gt;标记下方&lt; hr &gt;

这就是我现在所尝试的:

rank = response.xpath("//div[@class='info']//hr/preceding-sibling::p//text()='Videos:'").extract()

结果如下:

[u'0']

OR

rank = response.xpath("//div[@class='info']//hr/preceding-sibling::p/span[contains(text(), 'Videos:')]/text()|//hr/preceding-sibling::p//text()[not(parent::span)]").extract()

结果如下:

[u' 600', u'Total Videos:', u' 36', u' 1,815,767']

基本上我想提取数字基于范围文本,以及每个&lt; p &gt;标签在项目中分开。

谢谢

更新

我不能使用像p [1],p [2]等那样的东西......因为那些&lt; p &gt;可以互换,或者在其他页面上可能只有2。 &lt; span &gt;文字将保持不变

2 个答案:

答案 0 :(得分:2)

怎么样:

item["rank"] = response.xpath('//span[.="Rank:"]/following-sibling::text()[1]').extract_first()
item["videos"] = response.xpath('//span[.="Video Views:"]/following-sibling::text()[1]').extract_first()

答案 1 :(得分:1)

这应该有效。它看起来有点笨拙,因为它必须处理嵌套元素。

item['rank'] = ''.join(s.strip() for s in response.xpath('//div//span[contains(., "Rank:")]/ancestor::p/text()').extract())