使用BeautifulSoup修饰时忽略/跳过标签



在使用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()

生成结果:

<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/

最新更新