Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查找在特定数据上处于活动状态的所有HTML标记的列表_Python_Html_Beautifulsoup_Html Parsing - Fatal编程技术网

Python 如何查找在特定数据上处于活动状态的所有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以将其转换为其他格式,同时保留一些样式(粗体、列表等)

为了更好地解释我的意思

考虑以下代码:

<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在创建树的要求上更加严格。所以我想知道这对我有什么帮助/