如何查找在特定数据上处于活动状态的所有 HTML 标签的列表

How to find list of all HTML Tags which are active on a particular data

我想解析 HTML 以将其转换为其他格式,同时保留某些样式(粗体、列表等)。

为了更好地解释我的意思,

考虑以下代码:

<html>
<body>

<h2>A Nested List</h2>
<p>List <b>can</b> be nested (lists inside lists):</p>

<ul>
  <li>Coffee</li>
  <li>Tea
    <ul>
      <li>Black tea</li>
      <li>Green tea</li>
    </ul>
  </li>
  <li>Milk</li>
</ul>

</body>
</html>

现在,如果我要 select 段落开头的单词 "List",我的输出应该是 (html, body,p),因为这些是标签活跃于 "List".

这个词

另一个例子,如果我要 select 这个词 "Black tea",我的输出应该是 (html,body,ul,li,ul,li),因为它是一部分嵌套列表。

我见过 chrome 检查员这样做,但我不确定如何使用 Python.

在代码中做到这一点

这是 chrome 检查器显示的图像: Chrome Inspector

我已经尝试使用 Beautiful soup 解析 HTML,虽然获取数据非常棒,但我无法使用它解决我的问题。

后来我尝试了 html-parser 来解决同样的问题,试图在 "data" 之前制作所有标签的堆栈,并在遇到相应的结束标签时弹出它们,但是我也做不到。

正如您在评论中所说,它可能会或可能不会让您得到您想要的东西,但这可能是一个开始。所以无论如何我都会尝试一下,看看会发生什么:

from lxml import etree
snippet = """[your html above]"""
root = etree.fromstring(snippet)

tree = etree.ElementTree(root)
targets = ['List','nested','Black tea']
for e in root.iter():
    for target in targets:
        if (e.text and  target in e.text) or (e.tail and target in e.tail):
            print(target,' :',tree.getpath(e))    

输出为

List  : /html/body/h2
List  : /html/body/p
nested  : /html/body/p/b
Black tea  : /html/body/ul/li[2]/ul/li[1]

如您所见,它的作用是为您提供所选文本目标的 xpath。有几点需要注意:首先,"List" 出现了两次,因为它在文本中出现了两次。第二:"Black tea" xpath 包含位置值(例如,/li[2] 中的 [2]),表示目标字符串出现在片段的第二个 li 元素中,等等. 如果不需要,您可能需要从输出中删除该信息(或使用其他工具)。