我在使用 BeautifulSoup 和 Python 获取属性值时失败得很惨。以下是 XML 的结构:
...
</total>
<tag>
<stat fail="0" pass="1">TR=111111 Sandbox=3000613</stat>
<stat fail="0" pass="1">TR=121212 Sandbox=3000618</stat>
...
<stat fail="0" pass="1">TR=999999 Sandbox=3000617</stat>
</tag>
<suite>
...
我想要得到的是 pass
价值,但对于我的生活,我就是无法理解如何去做。我检查了 BeautifulSoup ,似乎我应该使用类似 stat['pass']
的东西,但这似乎不起作用。
这是我的代码:
with open('../results/output.xml') as raw_resuls:
results = soup(raw_resuls, 'lxml')
for stat in results.find_all('tag'):
print stat['pass']
如果我这样做 results.stat['pass']
它返回另一个标记内的值,在 XML blob 中向上。
如果我打印 stat
变量,我得到以下信息:
<stat fail="0" pass="1">TR=787878 Sandbox=3000614</stat>
...
<stat fail="0" pass="1">TR=888888 Sandbox=3000610</stat>
这似乎没问题。
我很确定我遗漏了什么或做错了什么。我应该看哪里?我采取了错误的方法吗?
任何建议或指导将不胜感激!谢谢
原文由 user7656533 发布,翻译遵循 CC BY-SA 4.0 许可协议
请考虑这种方法:
您的解决方案的问题是 pass 包含在 stat 中,而不是在您搜索它的 标签 中。
该解决方案搜索所有 _标签_,并在这些 标签 中搜索 stat 。从这些结果来看,它 通过 了。
对于 XML 文件
上面的脚本得到输出
添加
由于某些细节似乎仍不清楚(请参阅评论),请考虑使用
BeautifulSoup
这个完整的解决方法来获得您想要的一切。如果您遇到性能问题,这种使用字典作为列表元素的解决方案可能并不完美。但是由于您似乎在使用 Python 和 Soup 时遇到了一些麻烦,我想我尽可能简单地创建了这个示例,方法是提供按名称而不是索引访问所有相关信息的可能性。您可以按如下方式使用上面的脚本来做任何您想做的事情(例如,只需打印出来)
输出看起来像这样
让我们总结一下所使用的核心元素:
查找 XML 标签 要查找 XML 标签,您可以使用
soup.find("tag")
返回第一个匹配的标签或soup.find_all("tag")
查找所有匹配的标签并将它们存储在列表中。通过遍历列表可以轻松访问单个标签。查找嵌套标签 要查找嵌套标签,您可以使用
find()
或find_all()
再次将其应用于第一个find_all()
的结果访问标签的内容 要访问标签 的内容,您可以将
string
应用于单个标签。例如,如果tag = <tag>I love Soup!</tag>
tag.string = "I love Soup!"
。查找属性值 要获取属性值,您可以使用下标表示法。例如,如果
tag = <tag color=red>I love Soup!</tag>
tag['color']="red"
。为了解析形式为
"TR=abc123 Sandbox=abc123"
的字符串,我使用了常见的 Python 字符串拆分。您可以在此处阅读更多相关信息: How can I split and parse a string in Python?