我正在解析一个大小为 150mb 的 xml 文件。因为 beautifulsoup 是众所周知的,所以我选择了它。 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
,因为它只会获取第一个标签。
不过,您可以使用 lxml
或 html.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)
关于python - 使用 BeautifulSoup 从多个 XML 列表中提取文本数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45893301/