【问题标题】:Beautifulsoup xml parsing failure: find all returns only one resultBeautifulsoup xml解析失败:find all只返回一个结果
【发布时间】:2018-07-28 14:08:04
【问题描述】:

我正在尝试使用 beautifulsoup 从 xml 文件中解析所有数据集的 ID 我的脚本:

soup = BeautifulSoup(source, "lxml")

doc = soup.find_all('doc')
string = doc.find('str', attrs={"name":"id"})

一旦我运行它来获取每个文档的字符串,我就会出错:

AttributeError: ResultSet 对象没有“find”属性。您可能将项目列表视为单个项目。当你打算调用 find() 时,你调用了 find_all() 吗?

我尝试使用 For 循环,分别使用两种格式的字符串:

for doc in soup.find_all('doc'):

        string = doc.find_all('str', attrs={"name":"id"})
       OR
        string = doc.str

但它只返回一个结果第一个

这是我要解析的 xml 文本:“doc tag 肯定重复了几次”

<doc>
    <str name="id"></str>
    <str name="version">20110601</str>
    <arr name="access"></arr>
    <arr name="cf_standard_name"></arr><arr name="cmor_table">
    <str name="instance_id"></str>
</doc>

【问题讨论】:

标签: xml parsing beautifulsoup


【解决方案1】:

在您的示例中,soup.find_all('doc') 将以列表的形式返回所有元素。你需要迭代这个列表来找到你想要的信息。

如果你想提取&lt;doc&gt;标签内的特定标签,你可以通过多种方式来实现。我使用 CSS 选择器,例如soup.select('doc str[name="id"]') 将选择&lt;str&gt; 属性为name="id" 的所有&lt;doc&gt; 标签内的标签:

data = """<doc>
<str name="id">1</str>
<str name="version">20110601</str>
<arr name="access"></arr>
<arr name="cf_standard_name"></arr><arr name="cmor_table">
<str name="instance_id"></str>
</doc>

<doc>
<str name="id">2</str>
<str name="version">20110602</str>
<arr name="access"></arr>
<arr name="cf_standard_name"></arr><arr name="cmor_table">
<str name="instance_id"></str>
</doc>

<doc>
<str name="id">3</str>
<str name="version">20110603</str>
<arr name="access"></arr>
<arr name="cf_standard_name"></arr><arr name="cmor_table">
<str name="instance_id"></str>
</doc>
"""

from bs4 import BeautifulSoup
from pprint import pprint

soup = BeautifulSoup(data, 'lxml')

all_ids = [tag.text for tag in soup.select('doc str[name="id"]')]
all_versions = [tag.text for tag in soup.select('doc str[name="version"]')]

pprint([*zip(all_ids, all_versions)])

这个例子打印:

[('1', '20110601'), ('2', '20110602'), ('3', '20110603')]

【讨论】:

  • 我来晚了,但是有什么方法可以将一个 id 与同一个文档中的多个 标签匹配。 zip() 不起作用,因为两个列表 'all_ids' 和 'all_texts' 的长度不同
  • @SoumyaC 请在 StackOverflow 上打开新问题(带有示例输入和所需输出)并向我发送通知。
  • 发布了一个新问题:使用 BeautifulSoup 进行 XML 解析:在同一文档中检索具有相同文档编号的多个文本内容
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多