gpt4 book ai didi

python - 正则表达式捕获 html 元素及其类名

转载 作者:行者123 更新时间:2023-12-01 00:01:38 25 4
gpt4 key购买 nike

我正在尝试使用 python 获取 html 文件中所有元素的元素和类名称。我设法使用下面的代码获取所有类名。之所以这样写,是因为我将在存储元素及其类名时浏览大量 html 文件。忽略没有类名的元素。

 temp_file = open(root + "/" + file, "r", encoding="utf-8-sig", errors="ignore")
temp_content = temp_file.read()
class_names = re.findall("class=\"(.*?)\"", temp_content)

但是现在我正在努力寻找一种方法来获取该类所属的元素。请记住,元素有时会相互重叠,因此 readlines() 也不会有太大帮助,而且可能比立即重新调整整个文档慢。

<div class="header_container container_12">
<div class="grid_5">
<h1><a href="#">Logo Text Here</a></h1>
</div>
<div class="grid_7">
<div class="menu_items">
<a href="#" class="home active">Home</a><a href="#" class="portfolio">Portfolio</a>
<a href="#"
class="about">About Me
</a><a href="#" class="contact">Contact Me</a>
</div>
</div>
</div>

上面的 html 片段故意缩进得很严重,以展示我正在使用的数据类型......目标可能是将它们存储在 HashMap 中。即

"header_Container container_12": "div"
"grid_5": "div"
"grid_7": "div"
"menu_items": "div"
"home active": "a"
"portfolio": "a"
"about": "a"
"contact": "a"

最佳答案

正则表达式对于 HTML 解析来说是一个糟糕的选择,但幸运的是,这对于 BeautifulSoup 来说是微不足道的:

from bs4 import BeautifulSoup

html = """<div class="header_container container_12">
<div class="grid_5">
<h1><a href="#">Logo Text Here</a></h1>
</div>
<div class="grid_7">
<div class="menu_items">
<a href="#" class="home active">Home</a><a href="#" class="portfolio">Portfolio</a>
<a href="#"
class="about">About Me
</a><a href="#" class="contact">Contact Me</a>
</div>
</div>
</div>"""

for elem in BeautifulSoup(html, "lxml").find_all(attrs={"class": True}):
print(elem.attrs["class"], elem.name)

输出:

['header_container', 'container_12'] div
['grid_5'] div
['grid_7'] div
['menu_items'] div
['home', 'active'] a
['portfolio'] a
['about'] a
['contact'] a

您可以根据需要将其放入字典中,但要小心,因为可能会有多个元素映射到每个存储桶。它只会告诉您一个元素存在,并且具有特定的标记名称,并以特定的顺序给出特定的类名称字符串或元组。

elems = {}

for elem in BeautifulSoup(html, "lxml").find_all(attrs={"class": True}):
elems[tuple(elem.attrs["class"])] = elem.name

for k, v in elems.items():
print(k, v)

关于python - 正则表达式捕获 html 元素及其类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60305179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com