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

如果前一个元素包含匹配的text(),则使用XPath选择元素-Python,Scrapy,python,xpath,web-crawler,scrapy,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-zzz

如果前面的元素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>
但如果网站参数丢失,tr[3]向上移动,并且我在网站元素中得到“Type”,在Type中得到“Awards offered”,这种方法就会失败

xPath中是否有特定的命令,例如

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

提前感谢。

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

以下XPath即可:

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

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

    • 这也会起作用。。而且更通用

      //table[@class='layouttab']//td[contains(text(),'Website')]/following-sibling::td//text()
      
      如果页面上只有一个表,您在其中提取数据,那么这也将起作用

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

      对于python和scrapy,您应该使用以下选项来选择“类型”字段:, 这对我很有用

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