为Scrapy苦苦挣扎XPath表达式

时间:2014-05-07 18:00:32

标签: python-2.7 xpath scrapy

下面是一些html页面的部分(参数的所有名称都是俄语)。它有主类和两个内部类。详细的html代码:

    <div class="obj-params">
            <div class="wrap">
                <div class="obj-params-col" style="min-width:50%;">
                      <p>
                         <b>Param1_name</b>" Param1_value"</p>
                      <p>
                         <strong>Param2_name</strong>" Param2_value</p>
                      <p>
                         <strong>Param3_name</strong>" Param3_value"</p>
                </div>
              </div>
            <div class="wrap">
                <div class="obj-params-col">
                    <p>
                       <b>Param4_name</b>Param4_value</p>
                <div class="inline-popup popup-hor left">
                   <b>Param5_name</b>
                      <a target="_blank" href="link">Param5_value</a></div></div>

我想提取Param%d_value的值。我怎么能用XPath做到这一点?

我尝试过以下表达式:

//div[@class="inline-popup popup-hor left"]/a/text() #extract correctly the name of the link

但是,这个表达式构成了所有Param%d_value的列表,而不是按有序顺序排列:

//div[@class="obj-params"]/div[@class="obj-params-col"]/p/text()

问题是 - 我如何构建(每个param_value)XPath表达式? E.x.当我使用以下XPath表达式

//div[@class="obj-params"]//div[@class="obj-params-col"]/p/child::text()

['Param1_value, Param2_value, Param3_value, Param1_value, Param2_value, Param3_value, Param1_value, Param2_value, Param3_value']

我需要得到以下内容:

XPath_expression_to_extract_only_Param1_value:

['Param1_value, Param1_value, Param1_value, Param1_value, Param1_value, Param1_value, Param1_value, Param1_value, Param1_value']  


XPath_expression_to_extract_only_Param2_value:

['Param2_value, Param2_value, Param2_value, Param2_value, Param2_value, Param2_value, Param2_value, Param2_value, Param2_value']


XPath_expression_to_extract_only_Param3_value:

['Param3_value, Param3_value, Param3_value, Param3_value, Param3_value, Param3_value, Param3_value, Param3_value, Param3_value']              

2 个答案:

答案 0 :(得分:0)

您可以使用child::text()div obj-params-col类获取文本节点:

//div[@class="obj-params"]//div[@class="obj-params-col"]/p/child::text()

演示(使用xmllint):

$ xmllint index.html --xpath '//div[@class="obj-params"]//div[@class="obj-params-col"]/p/child::text()'
" Param1_value"
" Param2_value
" Param3_value"

更新:

如果您需要通过参数名称获取参数值,请使用:

//*[text()="Param1_name"]/following-sibling::text()

答案 1 :(得分:0)

sel.xpath('//*[contains(./text(),"Param1_name")]/following-sibling::text()').extract()
sel.xpath('//*[contains(./text(),"Param2_name")]/following-sibling::text()').extract()
sel.xpath('//*[contains(./text(),"Param3_name")]/following-sibling::text()').extract()