BeautifulSoup中的自闭合标签
使用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) 对输入进行两次处理,第一次弄清楚每个标签是怎么用的。你更喜欢哪个选择呢?