2017-08-26 53 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然后迭代列表。它的迭代部分,我失败了。 –

相关问题