BeautifulSoup中的自闭合标签

4 投票
2 回答
2039 浏览
提问于 2025-04-15 18:57

使用BeautifulSoup来解析我的XML

import BeautifulSoup

soup = BeautifulSoup.BeautifulStoneSoup( """<alan x="y" /><anne>hello</anne>""" ) # selfClosingTags=['alan'])

print soup.prettify()

这将输出:

<alan x="y">
 <anne>
  hello
 </anne>
</alan>

也就是说,anne标签是alan标签的子标签。

如果我在创建soup的时候传入selfClosingTags=['alan'],我会得到:

<alan x="y" />
<anne>
 hello
</anne>

太好了!

我的问题是:为什么不能用/>的存在来表示一个自闭合标签呢?

2 个回答

1

我没有特别的理由,但这可能对你有帮助。如果你使用 BeautifulSoup(不是石头哦)来解析带有自闭合标签的XML,它是可以工作的。算是吧:

>>> soup = BeautifulSoup.BeautifulSoup( """<alan x="y" /><anne>hello</anne>""" ) # selfClosingTags=['alan'])
>>> print soup.prettify()
<alan x="y">
</alan>
<anne>
 hello
</anne>

即使 alan 被显示为开始标签和结束标签,嵌套结构还是正确的。

3

你在问作者脑子里在想什么,尤其是他给像Beautiful[Stone]Soup这样的类或模块起名字的时候 :-)

这里还有两个关于BeautifulStoneSoup行为的例子:

>>> soup = BeautifulSoup.BeautifulStoneSoup(
    """<alan x="y" ><anne>hello</anne>"""
    )
>>> print soup.prettify()
<alan x="y">
 <anne>
  hello
 </anne>
</alan>

>>> soup = BeautifulSoup.BeautifulStoneSoup(
    """<alan x="y" ><anne>hello</anne>""",
    selfClosingTags=['alan'])
>>> print soup.prettify()
<alan x="y" />
<anne>
 hello
</anne>
>>>

我的理解是:如果解析器没有定义自闭合标签,那它就是不合法的。所以作者在处理像<alan x="y" />这样的非法片段时有几个选择: (1) 假设这个/是个错误 (2) 把alan当作一个自闭合标签来处理,不管它在输入中的其他地方是怎么用的 (3) 对输入进行两次处理,第一次弄清楚每个标签是怎么用的。你更喜欢哪个选择呢?

撰写回答