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

标签 python xml beautifulsoup

我正在解析一个大小为 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,因为它只会获取第一个标签。
不过,您可以使用 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)

关于python - 使用 BeautifulSoup 从多个 XML 列表中提取文本数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45893301/

相关文章:

python - 通过 Python 运行终端命令时出现问题

python - "Contains"类或正则表达式的美丽汤?

python - 如何使用 <small> 标签提取 <p> 中的文本

python - 在 OS X 上从 Django 使用 MySQL 时找不到 libmysqlclient.18.dylib 图像

python - 为 pyspark 设置 SparkContext

xml - XML 元素名称中包含的 XSLT 命名空间 URI

xml - XSLT 应用于具有 xmlns 属性的 XML 文档

python - BeautifulSoup 中的嵌套标签 - Python

python - 正确安装pyPDF2后导入错误

xml - Magento 2 : ifconfig in xml for module enable/disable