Python 如何查找在特定数据上处于活动状态的所有HTML标记的列表
我想解析HTML以将其转换为其他格式,同时保留一些样式(粗体、列表等) 为了更好地解释我的意思 考虑以下代码:Python 如何查找在特定数据上处于活动状态的所有HTML标记的列表,python,html,beautifulsoup,html-parsing,Python,Html,Beautifulsoup,Html Parsing,我想解析HTML以将其转换为其他格式,同时保留一些样式(粗体、列表等) 为了更好地解释我的意思 考虑以下代码: <html> <body> <h2>A Nested List</h2> <p>List <b>can</b> be nested (lists inside lists):</p> <ul> <li>Coffee</li> <li>
<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 inspector这样做,但我不确定如何使用Python在代码中这样做
以下是chrome inspector显示的图像:
我曾经尝试过使用BeautifulSoup解析HTML,虽然获取数据令人惊讶,但我无法使用它解决我的问题
后来我尝试了html解析器来解决同样的问题,尝试在“数据”之前生成一个所有标记的堆栈,并在遇到相应的结束标记时将它们弹出,但我也做不到。正如您在评论中所说,它可能会或不会满足您的需求,但这可能是一个开始。所以我无论如何都会尝试一下,看看会发生什么:
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。有几件事需要注意:首先,“列表”出现两次,因为它在文本中出现了两次。第二:“红茶”xpath包含位置值(例如,
/li[2]
中的[2]
),表示目标字符串出现在代码段的第二个li
元素中,等等。如果不需要,可能需要从输出中删除该信息(或使用其他工具).正如您在评论中所说,它可能会或可能不会满足您的需求,但它可能是一个开始。所以我无论如何都会尝试一下,看看会发生什么:
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。有几件事需要注意:首先,“列表”出现两次,因为它在文本中出现了两次。第二:“红茶”xpath包含位置值(例如,
/li[2]
中的[2]
),表示目标字符串出现在代码段的第二个li
元素中,等等。如果不需要,可能需要从输出中删除该信息(或使用其他工具).你能使用lxml吗?@JackFleeting我可以使用任何库,只要它在python中。虽然我觉得lxml在创建树的要求上更加严格。idk这对我有什么帮助/你能使用lxml吗?@JackFleeting我可以使用任何库,只要它在python中。虽然我觉得lxml在创建树的要求上更加严格。所以我想知道这对我有什么帮助/