2013-03-16 59 views
0

这一直困惑我一会儿,我无法弄清楚这是怎么回事。这是原来的XML文件:Python和BeautifulSoup洗牌我的标签?

<?xml version="1.0" encoding="UTF-8" ?> 
<book> 
    <meta> 
    <title>Some Title</title> 
    <creator>Another Author</creator> 
    <language>en-US</language> 
    ... 
    </meta> 
    <chapter> 
    ... 
    </chapter> 
</book> 

然后我读的文件:

with open(filename) as f : 
    soup = BeautifulSoup(f); 
    print(soup.root) 

而且,奇怪的是,转储以下:

<html><body><book> 
<meta/> 
<title>Some Title</title> 
<creator>Some Author</creator> 
<language>en-US</language> 
... 

那么,为什么啊,为什么是<meta>汤中的标签为空,当它不在原始XML文件中时? (我可以发誓这个工作仅仅两个星期前就开始了,我也可以发誓我没有触及脚本,我对XML文件进行了一些细微的修改,但是我没有看到相关性。)

回答

0

您正在HTML解析器中打开一个XML文件。 BeautifulSoup试图修复它预期的HTML结构。

相反,使用XML解析器,或使用BeautifulSoup in XML mode

soup = BeautifulSoup(f, 'xml') 

对于这个工作,你安装lxml必须的。

lxml本身就是一个很好的XML库。您也可以使用Python附带的ElementTree库; lxml基于相同的API,但具有更多功能。

+0

哎,现在工作了!但为什么过去这不会发生?只是愚蠢的运气?现在你提出了lxml,我实际上是重写脚本来使用lxml并转储BeautifulSoup。那时我遇到了这个问题,因为我想比较输出并确保它们是相同的。 – Jens 2013-03-16 21:50:57

+0

@Jens:BeautifulSoup一直试图尽可能最好地修复HTML,但是输出可能会因版本不同而不同。 – 2013-03-16 21:55:55

+0

“试图修复”的部分是有道理的,但什么是破坏...哦,我碰巧使用相同的名称“元”,不是吗?!这就是解析器的混淆,它关闭了标签,将孩子移出。如果我以不同的方式命名标签,这不会显示?! – Jens 2013-03-16 21:58:33