2017-08-26 91 views
1

我正在解析一個xml文件(150mb)的大小。爲此,因爲美麗的衣服是衆所周知的,所以我把它撿起來了。 XML格式是這樣的:使用BeautifulSoup從多個XML列表中提取文本數據

<tag> 
    <tag1> 
    <texttag>Some text</texttag> 
    </tag1> 
</tag> 

<tag> 
    <tag1> 
    <texttag>Some other text</texttag> 
    </tag1> 
</tag> 
我有2000個這樣的元素

。 由於根標籤是不是在這裏,所以我把它分解每個元素的主要標籤的基礎上,因爲它的同一和轉換成list(再次其中兩千元)。這是怎麼一回事呢:

import itertools as it 
from bs4 import BeautifulSoup 
filename = 'some.xml' 
btree = BeautifulSoup(open(filename), "lxml-xml") 

with open(filename,'r') as f: 
for key,group in it.groupby(f,lambda line: line.startswith('tag')): 
    if not key: 
     group = list(group) 
     #print(group) 
     texttags= btree.find_all("texttag") 
     for text in texttags: 
      print (text.string) 

在運行,而不是迭代到下一個元素,並顯示其文本等,它顯示的第一個元素的內容2000倍,而不是從所有提到的標籤的元素顯示文本的。有人可以糾正我嗎?

PS:我無法修改XML的結構。另外,我還是一個業餘愛好者,他們還在蟒蛇及其圖書館工作。

回答

1

恐怕你不能使用lxml-xml這個文件,因爲它只會搶了先標記。
但是,您可以使用lxmlhtml.parser

btree = BeautifulSoup(open(filename), "html.parser") 
texttags= btree.find_all("texttag") 
for text in texttags: 
    print(text.string) 

另外,如果必須使用lxml-xml,你可以使用html.parser收集標籤,然後建立一個新的BeautifulSoup對象和附加標籤的根標籤。

soup = BeautifulSoup(open(filename), "html.parser") 
btree = BeautifulSoup("<root></root>", "lxml-xml") 

for tag in soup.find_all('tag'): 
    btree.root.append(tag) 
+0

非常感謝@ t.m.adam。我確實得到了我的結果,但需要一段時間。我的意思是我的xml文件絕不是一個小文件,但您仍然可以提出任何建議來提高獲得結果的速度嗎? –

+1

如果你只是想提取字符串使用在我的崗位第一代碼片段;並使用'lxml'而不是'html.parser'。如果您只對某個標籤感興趣,請考慮使用正則表達式,它比bs4快得多。 –

0

有兩個錯誤。首先,不要打開(「文件名」),你需要打開(文件名)。在你的代碼中,你基本上操作兩個文件而不是一個:'some.xml'和'filename'。

其次,在用BeautifulSoup解析後,不需要打開打開(...)的文件。整個代碼應該是:

from bs4 import BeautifulSoup 
filename = 'some.xml' 
btree = BeautifulSoup(open(filename), "lxml-xml") 

texttags= btree.find_all("texttag") 
for text in texttags: 
    print (text.string) 
+0

感謝您的回覆。我糾正了第一個錯誤。 對於第二一個,如果有一個根元素,將工作馬上。 但在我的情況下,沒有根元素存在。相反,元素會以不同的數據重複多次。這就是爲什麼我不得不分割的XML和每個元素轉換成上我執行find_all然後迭代列表。它的迭代部分,我失敗了。 –

相關問題