2012-03-08 66 views
2

我解析一个XML文件使用美丽的汤,但发现解析空元素时不一致的行为。即美丽的汤空元素错误

from BeautifulSoup import BeautifulSoup 
s1 = "<c><a /><b /></c>" 
s2 = "<c><a></a><b></b></c>" 
soup1 = BeautifulSoup(s1) 
soup2 = BeautifulSoup(s2) 
print soup1 
# <c><a><b></b></a></c> 
print soup2 
# <c><a></a><b></b></c> 

注意,b标签是在第一种情况下a标签内,而不是在第二位。我认为XML规范意味着s1s2是等同的?

有什么想法可以解决这个问题?

回答

1

锚点和粗体(<a>,<b>)元素不能自行关闭,所以这是无效的XHTML。

最重要的是,所述XHTML spec说的空间必须导致斜线:

包括结尾之前的空间和/>空元素,例如的<,< hr />和< img src =“karen.jpg”alt =“Karen”/>。另外,对空元素使用最小化标记语法,例如,作为备选语法< br> </br>由XML允许在许多现有的用户代理中给出不确定的结果。

+0

“a”和“b”的选择是任意的。我正在使用XML标记,而不是(X)HTML。另外,增加空间并没有什么不同。 – BrT 2012-03-08 13:43:59

+1

BrT:BeautifulSoup是一个(X)HTML解析器,__not__是一个XML解析器。正因为如此,它只支持有意义的元素的自闭标签。对于通用XML解析,请使用__ ['xml.dom.minidom'](http://docs.python.org/library/xml.dom.minidom.html#module-xml.dom.minidom)__。我不确定它是否支持自闭标签,但如果不支持,您可以随时替换为正则表达式。 – orlp 2012-03-08 13:55:24

+0

啊,对不起,我没有意识到关于BeautifulSoup - 我会看看minidom。谢谢! – BrT 2012-03-08 14:44:08