2013-03-16 57 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