0

我正在尝试在 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 是如此强大,以至于我想要的内容可能是某种我无法弄清楚它的身份的分支。

4

1 回答 1

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)
于 2010-03-07T17:40:36.627 回答