【问题标题】:Getting list based on text lxml基于文本 lxml 获取列表
【发布时间】:2016-06-02 18:45:09
【问题描述】:

我有一些像这样的html:

... 
    <table width="100%">
            <tr class="blueborder">
              <td colspan="2" class="blackbold">Some Other Text</td>
            </tr>
          </table>
          <table width="100%">     
        <tr class="upcoming">
          <td class="lists" >
            <ul>
              <li> List1 Element1</li>
              <li> List1 Element2</li>
              <li> List1 Element3</li>
            </ul>
          </td>
        </tr>
     </table>
      <table width="100%">
        <tr class="blueborder">
          <td colspan="2" class="blackbold">Signaling Text</td>
        </tr>
      </table>
      <table width="100%">
        <tr class="upcoming">
          <td class="lists" >
            <ul>
              <li> List2 Element1</li>
              <li> List2 Element2</li>
              <li> List2 Element3</li>
            </ul>
          </td>
        </tr>
     </table>   
...

我使用的是employees = root.xpath('.//td[@class = "lists"]/ul/li/text()'),但这会同时获取两个列表元素。我只想获取列表 2,但它们具有相同的属性(类等)。唯一的区别是&lt;td colspan="2" class="blackbold"&gt;Signaling Text&lt;/td&gt; 在我想要的列表之前。有什么方法可以表明在此之后只获取此列表吗?

【问题讨论】:

    标签: python web-scraping lxml


    【解决方案1】:

    你可以在 tr 之后选择下面的 td 加上文本Signaling Text

    h = """ <table width="100%">
                <tr class="blueborder">
                  <td colspan="2" class="blackbold">Some Other Text</td>
                </tr>
              </table>
              <table width="100%">
            <tr class="upcoming">
              <td class="lists" >
                <ul>
                  <li> List1 Element1</li>
                  <li> List1 Element2</li>
                  <li> List1 Element3</li>
                </ul>
              </td>
            </tr>
         </table>
          <table width="100%">
            <tr class="blueborder">
              <td colspan="2" class="blackbold">Signaling Text</td>
            </tr>
          </table>
          <table width="100%">
            <tr class="upcoming">
              <td class="lists" >
                <ul>
                  <li> List2 Element1</li>
                  <li> List2 Element2</li>
                  <li> List2 Element3</li>
                </ul>
              </td>
            </tr>
         </table>  """
    
    from lxml import html
    tree = html.fromstring(h)
    print(tree.xpath('//td[contains(.,"Signaling Text")]/following::td[@class = "lists"]/ul/li/text()'))
    

    这会给你:

    [' List2 Element1', ' List2 Element2', ' List2 Element3']
    

    或者如果您确定这是第二次出现:

    tree.xpath('(//td[@class = "lists"])[2]/ul/li/text()')
    

    【讨论】:

    • 我知道必须有一些简单的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2014-12-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多