html中锚标记(a)之间的内容是否被视为lxml中的分支?

时间:2010-03-07 17:01:58

标签: python html lxml

我想在html文档中获取一些内容。一些文档有一个目录,非常好地指出了我想要删除的内容在文档中的位置。也就是说,标签的value或text_content很容易识别,并指向我需要的东西。例如,我可能在toc中有两个具有以下值的锚标记

key=href value=#listofplaces text_content=Places we have visited
key=href value=#transport text_content=Ways we have traveled

然后在文档正文中

key=name value=listofplaces text_content=''

然后有很多html元素,一些表格,可能是一些div标签,一些未知数量的元素后跟下一个锚点

key=name value=transport text_content=''

我计划使用函数的输出来识别我想从文档中复制的部分的开头和结尾。那就是我要阅读文档并剪掉锚标签listofplaces和transport之间的部分。我开始认为LXML是如此强大,以至于我想要的内容可能是某种分支,我只是无法弄清楚它的身份。

1 个答案:

答案 0 :(得分:1)

不,兄弟姐妹之间没有一个分支。但是,您可以迭代其父级并提取(可以通过各种方式完成,具体取决于您已经拥有锚标记的句柄)。请注意文本和尾部的处理以避免丢失数据。修改 example_doc 以查看结果可能有助于您更好地理解此示例代码。

import lxml.etree

example_doc = """
  <root>
    <a name="listofplaces"/>
    text
    <sibling/>
    <sibling/>
    <a name="transport"/>
  </root>
"""
root = lxml.etree.XML(example_doc)

new_root = lxml.etree.Element("root")
it = iter(root)
for e in it:
  if e.tag == "a" and e.get("name") == "listofplaces":
    new_root.text = e.tail
    break
else:
  assert False, "TODO: handle tag not found"
for e in it:
  if e.tag == "a" and e.get("name") == "transport":
    break
  new_root.append(e)
else:
  assert False, "TODO: handle tag not found"

print lxml.etree.tostring(new_root)