使用 BeautifulSoup 从多个 XML 列表中提取文本数据



我正在解析一个大小为xml文件(150mb(。为此,由于美汤是众所周知的,所以我把它捡起来了。 xml 格式如下所示:

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

我有两千个这样的元素。 由于根标签不在这里,所以我根据每个元素的主标签将其拆分,因为它是相同的并转换为列表(再次是两千个(。事情是这样的:

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的结构。另外,我是一个业余爱好者,仍然涉足python及其库。

恐怕你不能在这个文档中使用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)

有两个错误。首先,您需要打开(文件名(而不是打开("文件名"(。在你的代码中,你基本上操作两个文件而不是一个:"some.xml"和"filename"。

其次,在使用 BeautifulSoup 解析文件后,无需使用 open(...( 打开文件。整个代码应该是:

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)

最新更新