【问题标题】:XPath to select an element if previous element contain a matching text() - Python, Scrapy如果前一个元素包含匹配的文本(),则选择元素的 XPath - Python,Scrapy
【发布时间】:2012-08-01 19:50:13
【问题描述】:

如果前面的元素 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。 我正在使用带有scrapy 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"}

提前致谢。

【问题讨论】:

    标签: python xpath web-crawler scrapy


    【解决方案1】:

    对于python和scrapy,您应该使用以下选择“类型”字段, 对我来说效果很好。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        以下 XPath 可以:

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

        【讨论】:

          【解决方案4】:

          这对我有用:

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

          【讨论】:

            【解决方案5】:

            这也可以..而且更通用..

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

            如果您要提取数据的页面上只有一个表,那么这也可以工作..

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-06-25
              • 2023-03-18
              • 1970-01-01
              • 2014-01-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多