如何使用 bs4 或 lxml 获取在 Python 中找到 XML 标记的文本行?

Mar*_*oDG 5 python xml lxml beautifulsoup

我有一个 XML 文档,我想获取由BeautifulSouporlxml提取的标签所在的行。有没有办法做到这一点?

ave*_*age 4

对于 BeautifulSoup,此属性存储在Tag 类的sourceline 属性中,并在解析器中填充这里这里

对于 lxml,这也可以通过 sourceline 属性实现。这是一个例子:

#!/usr/bin/python3
from lxml import etree
xml = '''
<a>
  <b>
    <c>
    </c>
  </b>
  <d>
  </d>
</a>
'''
root = etree.fromstring(xml)

for e in root.iter():
    print(e.tag, e.sourceline)
Run Code Online (Sandbox Code Playgroud)

输出:

a 2
b 3
c 4
d 7
Run Code Online (Sandbox Code Playgroud)

如果您想查看sourceline 方法的实现,它实际上是调用xmlGetLineNo ,它是来自 libxml2 的xmlGetLineNo的绑定,它是xmlGetLineNoInternal的包装器(其中实际逻辑位于 libxml2 内部)。

您还可以通过检查该标签的子树的文本表示形式中有多少行结尾来找到结束标签的行号。

还可以扩展xml.etree.ElementTree以提供解析器找到元素的行号(解析器是来自模块xml.parsers.expat的 xmlparser )。