使用XPATH查找特定元素,然后从该元素向前移动以查找树中

时间:2017-02-16 02:05:16

标签: html python-2.7 xpath lxml

我可以在html文档中识别出一些文字,这些文字位于我正在寻找的表格之前。然而,我正在努力从包含文本的元素转到我想要找到的表格。

我有一个包含一些文字的文件。通过查找字体标记内的一些单词来识别此文本。文本后面有表格 - 结构可能看起来像

my_string = """<html>
<div><p>maybe some words</p>
<div></div>
<div><font>PICKLES are selling well</font></div>
<div><p>maybe some words</p><table><tr><td>123</td></tr></table></div>
<html>"""

我正在将该表显示为以下div的子项,但我想要一般情况,表格可能是div或ap的子项,这是一些未知元素,位于树中我的字体所在的位置。< / p>

我已经能够获得我的字体,然后使用以下表达式返回其父级

首先是

test_tree = html.fromstring(my_string)

所以找到魔法元素

for e in test_tree.xpath(('//font[contains(text(),"PICKLES")]'):
    magic_element = e

现在我已经找到了这个元素,以便我知道树中的下一个表格将是我需要的表格,我已成功回到主要的&#39; trunk&#39;现在从那里我想找到下一张桌子

parent = magic_element.xpath('parent::*')[0]

当我看到父母时,它是我下一步的正确元素

>>> parent
<Element div at 0x2f8a6d8>

现在我拥有了我的font元素的父级,我想从那个位置沿着树下去找到下一个表格。我假设我可以使用以下代码开始讨论

sibling = parent.xpath('following-sibling::')

然而,这给了我一条错误信息。

因此,如何从名为 parent 的元素继续检查我的文档,因为我需要找到父文件,然后继续下一步找到我要提取的内容。

请注意,我的文档比上面的内容更复杂。在这个例子中找到唯一的表是很简单的 - 通常在我要查找的元素之前文档中还有其他表(数十个),并且可能有几十个跟随我想要的特定表。

1 个答案:

答案 0 :(得分:2)

对于您的HTML,调整为格式良好的XML,并进行格式化以便于阅读:

<html> 
  <div>
    <p>maybe some words</p>
  </div>  
  <div/>  
  <div>
    <font>PICKLES are selling well</font>
  </div>  
  <div>
    <p>maybe some words</p>
    <table>
      <tr>
        <td>123</td>
      </tr>
    </table>
  </div> 
</html>

这个XPath表达式,

//font[contains(text(),"PICKLES")]/following::table[1]

将选择文档中第一个table元素,该元素位于其字符串值为给定文本的font元素之后。

将此问题与问题联系起来,并从评论中提出答案

for e in test_tree.xpath(('//font[contains(text(),"PICKLES")]'):
    e_text = e.text_content()  #to illustrate that I can do something with this element
    my_table = e.xpath('./following::table[1]')[0]  #while only one table is found a list is returned with the table as the only element of the list