在使用BeautifulSoup解析和美化html文档时,是否可以忽略/跳过某些标记?
我正在使用BeautifulSoup来美化html文档与大型嵌入svg图像。不需要美化svg图像及其所有子元素。由于性能对这个应用程序至关重要,所以我认为在美化HTML时忽略/跳过svg元素,只在输入中包含svg元素,这样可以节省一些运行时间。
我知道soupfilter,但它似乎与我需要的完全相反。我也读了很多关于StackOverflow和其他地方的帖子,似乎没有一个解决这个问题。
# Messy HTML code.
messy =
"""
<html> <head>
<title>
Some title</title>
</head> <body>
<svg>Don't parse and prettify this!</svg>
</body> </html>
"""
# Prettify the HTML code.
from bs4 import BeautifulSoup
pretty = BeautifulSoup(markup=messy, features='html.parser').prettify()
# Messy HTML code.
messy =
"""
<html> <head>
<title>
Some title</title>
</head> <body>
<svg>Don't parse and prettify this!</svg>
</body> </html>
"""
# Prettify the HTML code.
from bs4 import BeautifulSoup
pretty = BeautifulSoup(markup=messy, features='html.parser').prettify()
生成结果:
<html>
<head>
<title>
Some title
</title>
</head>
<body>
<svg>
Don't parse and prettify this!
</svg>
</body>
</html>
注意,<svg>
元素也被BeautifulSoup解析和美化了。有办法避免这种情况吗?
谢谢!
据我所知,bs4不允许跳过特定的标签;但是您可以编写自己的解析器(像这里),并包含或允许异常,或者使用regex替换您不想解析的标记。
首先,列出要跳过解析
的标记skipTags = ['svg']
# skipTags = ['svg', 'script', 'style'] ## list all the tag names to skip
如果你不关心保留标签,你可以完全去掉它们。
# import re
# from bs4 import BeautifulSoup
for n in skipTags: messy = re.sub(f'<{n}s*.*s*>s*.*s*</{n}>', '', messy)
pretty = BeautifulSoup(markup=messy, features='html.parser').prettify()
如果想保留标签,则用注释替换它们,然后在美化后替换注释。[这比直接删除它们要慢很多。)
# import re
# from bs4 import BeautifulSoup
cReps = []
for n in skipTags:
rcpat = re.compile(f'<{n}s*.*s*>s*.*s*</{n}>')
cReps += [m.span() for m in rcpat.finditer(messy)]
for cri, (sPos, ePos) in list(enumerate(cReps))[::-1]:
repCmt, orig = f'<!--do_not_parse__placeholder_{cri}-->', messy[sPos:ePos]
messy = messy[:sPos] + repCmt + messy[ePos:]
cReps[cri] = (repCmt, orig)
pretty = BeautifulSoup(markup=messy, features='html.parser').prettify()
for repCmt, orig in cReps:
pretty = pretty.replace(repCmt, orig, 1)
print('<!--messy-subbed-->', messy, 'n<!--pretty-->', pretty, sep='n')
上面最后一条语句的打印输出,带有问题中的示例HTML,如下所示:
<!--messy-subbed-->
<html> <head>
<title>
Some title</title>
</head> <body>
<!--do_not_parse__placeholder_0-->
</body> </html>
<!--pretty-->
<html>
<head>
<title>
Some title
</title>
</head>
<body>
<svg>Don't parse and prettify this!</svg>
</body>
</html>
注意我不知道这两种方法是否真的会提高性能,特别是当您考虑到它将通过HTML字符串/s多少次时。您可能需要查看https://thehftguy.com/2020/07/28/making-beautifulsoup-parsing-10-times-faster/