Beautifulsoup xml解析失败:查找全部仅返回一个结果

时间:2018-07-28 14:08:05

标签: xml parsing beautifulsoup

我正在尝试使用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标记肯定重复了几次”

<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>

1 个答案:

答案 0 :(得分:1)

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

如果您想在<doc>标记内提取特定的标记,则可以通过多种方式来完成。我使用CSS选择器,例如soup.select('doc str[name="id"]')将选择<str>标签内所有具有属性name="id"的{​​{1}}标签:

<doc>

此示例打印:

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)])