如果前一个元素包含匹配的文本(),则选择一个元素的XPath - Python,Scrapy

时间:2012-08-01 19:50:13

标签: python xpath web-crawler scrapy

如果前面的元素text()与特定条件匹配,我想提取一个元素。例如,

<html>
<div>
<table class="layouttab">
    <tbody>
    <tr>
        <td scope="row" class="srb">General information:&nbsp;&nbsp;</td>
        <td>(xxx) yyy-zzzz</td>
    </tr>
    <tr>
        <td scope="row" class="srb">Website:&nbsp;&nbsp;</td>
        <td><a href="http://xyz.edu" target="_blank">http://www.xyz.edu</a>
        </td>
    </tr>
    <tr>
        <td scope="row" class="srb">Type:&nbsp;&nbsp;</td>
        <td>4-year, Private for-profit</td>
    </tr>
    <tr>
        <td scope="row" class="srb">Awards offered:&nbsp;&nbsp;</td>
        <td>Less than one year certificate<br>One but less than two years certificate<br>Associate's degree<br>Bachelor's
            degree
        </td>
    </tr>
    <tr>
        <td scope="row" class="srb">Campus setting:&nbsp;&nbsp;</td>
        <td>City: Small</td>
    </tr>
    <tr>
        <td scope="row" class="srb">Related Institutions:</td>
        <td><a href="?q=xyz">xyz-New York</a>
            (Parent):
            <ul>
                <li style="list-style:circle">Berkeley College - Westchester Campus</li>
            </ul>
        </td>
    </tr>
    </tbody>
</table>
</div>
</html>

现在,如果前一个元素在text()属性中有“Website:”,我想提取URL。 我使用scthon 0.14的python 2.x.我能够使用单个元素(如

)提取数据
 item['Header_Type']= site.select('div/table[@class="layouttab"]/tr[3]/td[2]/text()').extract()

但是如果缺少网站参数并且tr [3]向上移动并且我在网站元素中获得“类型”并且在类型中获得“奖励提供”,则此方法将失败。

xPath中是否有特定命令,

'div/table[@class="layouttab"]/tr/td[2] {if td[1] has text = "Website"}

提前致谢。

5 个答案:

答案 0 :(得分:5)

对于python和scrapy,您应该使用以下选择“Type”字段, 为我工作很棒。

item['Header_Type']= site.select('div[1]/table[@class="layouttab"]/tr/td[contains(text(),"Type")]/following-sibling::td[1]/text()').extract()

答案 1 :(得分:4)

我认为

div/table[@class="layouttab"]\tr\td[text()="Website"]\following-sibling::node()会奏效。否则,您可以使用parent并从那里转到td[2]

答案 2 :(得分:1)

以下XPath将执行:

/html/div/table[@class='layouttab']/tbody/tr/td[contains(text(),'Website')]/following-sibling::td[1]

答案 3 :(得分:1)

这对我有用:

/html/div/table[@class="layouttab"]/tbody/tr/td[. = 'Website:  ']/following-sibling::td/a/text()
  • 向下钻取至td,查看其文字是否与Website:
  • 相符
  • 使用following-sibling转到下一个td
  • 向下钻取以检索a并使用text()
  • 获取网址

答案 4 :(得分:0)

这也有效..而且更通用..

//table[@class='layouttab']//td[contains(text(),'Website')]/following-sibling::td//text()

如果页面上只有一个表用于提取数据,那么这也可以正常工作..

//td[contains(text(),'Website')]/following-sibling::td//text()