代码之家  ›  专栏  ›  技术社区  ›  Minions

BeautifulSoup自动关闭未关闭的html标记

  •  1
  • Minions  · 技术社区  · 2 年前

    我对BeautifukSoup有意见。每当我解析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.passer”来解决这个问题。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Andrej Kesely    2 年前

    你可以 poke through bs4 internals 并修改 html.parser 处理HTML(这适用于我的版本 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>