如何查找在特定数据上处于活动状态的所有 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
元素中,等等. 如果不需要,您可能需要从输出中删除该信息(或使用其他工具)。
我想解析 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
元素中,等等. 如果不需要,您可能需要从输出中删除该信息(或使用其他工具)。