构造Xpath

时间:2014-05-01 21:57:06

标签: python-2.7 xpath web-scraping scrapy

我有以下重复的网页:

<div class="txt ext">
 <strong class="param">param_value1</strong>            
 <strong class="param">param_value2</strong>                                                
</div>

我想使用Xpath单独提取值param_value1param_value2。我该怎么办?

我尝试过以下结构:

'//strong[@class="param"]/text()[0]'
'//strong[@class="txt ext"]/strong[@class="param"][0]/text()'
'//strong[@class="param"]'

其中没有一个单独归我param_value1param_value2

P.S。我正在使用Python 2.7和最新版本的Scrapy。

2 个答案:

答案 0 :(得分:2)

//表示后代或自我。您在任何上下文中选择任何strong元素。 [...]是一个谓词,它根据某些布尔测试限制您的选择。没有strong元素的class属性等于txt ext,因此您可以排除第二个表达式。

您的上一个表达式实际上将返回具有strong属性的所有param元素的节点集。然后,您可以从节点集中提取单个节点(使用[1][2]),然后获取其文本内容(使用text())。

您的第一个表达式选择两个节点的文本内容,但它也是错误的。它位于错误的位置,您无法选择节点零(它不存在)。如果您想要第一个节点的文本内容,您应该使用:

//strong[@class="param"][1]/text()

你可以使用

//strong[@class="param"][2]/text()

第二个文字。

答案 1 :(得分:2)

这是我的测试代码:

test_content = '<div class="txt ext"><strong class="param">param_value1</strong><strong class="param">param_value2</strong></div>'

sel = HtmlXPathSelector(text=test_content)
sel.select('//div/strong[@class="param"]/text()').extract()[0]   
sel.select('//div/strong[@class="param"]/text()').extract()[1]