我想解析 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>
现在,如果我要在段落开头选择单词“List”,我的输出应该是 (html, body,p),因为这些是单词“List”上事件的标签。
另一个例子,如果我选择单词“Black tea”,我的输出应该是 (html,body,ul,li,ul,li),因为它是嵌套列表的一部分。
我已经看到 chrome 检查器执行此操作,但我不确定如何使用 Python 在代码中执行此操作。
这是 chrome 检查器显示的图像: Chrome Inspector
我尝试使用 Beautiful soup 解析 HTML,虽然获取数据的效果令人惊叹,但我无法使用它解决我的问题。
后来我尝试了 html-parser 来解决同样的问题,尝试在“数据”之前创建一个所有标签的堆栈,并在遇到相应的结束标签时将它们弹出,但我也无法做到。
最佳答案
正如您在评论中所说,它可能会也可能不会给您带来您想要的东西,但这可能是一个开始。所以无论如何我都会尝试一下,看看会发生什么:
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 包含位置值(例如, [2]
中的 /li[2]
),指示目标字符串出现在第二个 li
中。代码片段的元素等。如果您不需要,您可能需要从输出中删除该信息(或使用其他工具)。
关于python - 如何查找对特定数据有效的所有 HTML 标签的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58748641/