我想提取标签外的文本,并将其与范围内的文本进行匹配。
这是代码:
<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;文字将保持不变
答案 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())