我正在尝试使用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>
答案 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)])