2013-06-13 136 views
0

我有一個文件充滿句子包裝在格式良好的XML(xmllint和tidylib這樣說)。 所以這個xml看起來像這樣:xml解析終止莫名其妙

<a id="100" attr1="text" attr1="text" attr1="text"> 
<tagname id="1"> 
This is my sentence. 
</tagname> 
</a> 
<a id="101" attr1="text" attr1="text" attr1="text"> 
<tagname id="1"> 
This is my sentence. 
</tagname> 
</a> 

等等。

我用下面的代碼(從ID 1在這種情況下,以85)提取與屬性句子

a1 = open(r"file.xml",'r') 
a = a1.readlines() 
a1.close() 
soup = BeautifulSoup(str(a)) 
for i in range(1,85): 
    a = soup.find('a', {'id': i}) 
    achild = a.find('tagname') 
    tagnametext = achild.contents 
    print tagnametext 

一切打印很好,直到句子84,在該收到錯誤: achild = a.find('tagname') AttributeError:'NoneType'對象沒有屬性'find'

每一組......都是用for循環生成的,所以xml都是一樣的。 我用不同數量的句子嘗試過不同的文件。發生錯誤的ID也會發生變化。 這是美麗的限制嗎? 它不能掃描一定數量的行?

+0

這是什麼ID號84是什麼樣子? – TerryA

回答

0

它在最後一行失敗。它可能是一個文件編碼問題,該行包含一些有趣的EOF字符,或者該行不被解釋爲字符串。你能打印出最後一行,然後看看它是什麼類型?

0

最有可能a = soup.find('a', {'id': i})84不會返回您所期望的。 find()返回None如果找不到標記,則說明AttributeError

此外,在您的代碼中,您似乎是BeautifulSouping列表(以字符串表示)。

soup = BeautifulSoup(str(a)) 

您正在對列表進行串聯,然後將清單弄糟,這很愚蠢。如果湯整個文件,然後遍歷每個標籤,如果它有一個id

from bs4 import BeautifulSoup 
with open('file.xml', 'r') as myfile: 
    soup = BeautifulSoup(myfile.read()) 
    for i in soup.find_all('a', id=True): 
     print i.tagname.contents 

打印:

[u'\nThis is my sentence.\n'] 
[u'\nThis is my sentence.\n'] 
+0

soup = BeautifulSoup(myfile.read())崩潰我的Python空閒圖形用戶界面。該文件包含大約140,000個句子 – Jean

+0

@waterling可能不是最好的選擇。 – TerryA