我对美食汤有意见.每当我解析一个HTML输入时,它都会关闭没有关闭的HTML标记(例如,<input>,或者没有错误关闭的标记).

例如:

from bs4 import BeautifulSoup

tags = BeautifulSoup('<span id="100" class="test">', "html.parser")
print(str(tags))

打印:

<span id="100" class="test"></span>

在这里,我的主要目标是在解析后保留HTML输入的原始形状.

我发现使用"XML" parser而不是"html.parser"是可能的,但我希望为"html.parser"解决这个问题.

推荐答案

您可以对html.parser处理HTML的方式进行poke through bs4 internals和修改(这适用于我的bs4==4.12.2版):

from bs4 import BeautifulSoup
from bs4.builder import builder_registry
from bs4.formatter import HTMLFormatter


class UnsortedAttributes(HTMLFormatter):
    def __init__(self):
        super().__init__(
            void_element_close_prefix=""
        )  # <-- use void_element_close_prefix="" here

    def attributes(self, tag):
        yield from tag.attrs.items()


html_text = """\
<closed_tag>
    <my_tag id="xxx">
    <my_other_tag id="zzz">
</closed_tag>"""

builder_registry.lookup("html.parser").empty_element_tags = {"my_tag", "my_other_tag"}

soup = BeautifulSoup(html_text, "html.parser")
print(soup.encode(formatter=UnsortedAttributes()).decode())

打印:

<closed_tag>
<my_tag id="xxx">
<my_other_tag id="zzz">
</closed_tag>

Python相关问答推荐

韦尔福德方差与Numpy方差不同

Python中的嵌套Ruby哈希

用合并列替换现有列并重命名

Polars:用氨纶的其他部分替换氨纶的部分

使用groupby Pandas的一些操作

我们可以为Flask模型中的id字段主键设置默认uuid吗

如何在给定的条件下使numpy数组的计算速度最快?

如果值发生变化,则列上的极性累积和

cv2.matchTemplate函数匹配失败

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

在matplotlib中使用不同大小的标记顶部添加批注

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

我对这个简单的异步者的例子有什么错误的理解吗?

从一个df列提取单词,分配给另一个列

如何从比较函数生成ngroup?

504未连接IB API TWS错误—即使API连接显示已接受''

提取最内层嵌套链接

如何获得满足掩码条件的第一行的索引?

设置索引值每隔17行左右更改的索引

为什么这个正则表达式没有捕获最后一次输入?