我正在使用Google API,他们提供了返回JSON或ATOM的选项。 ATOM看起来像XML语法,我想使用BeautifulSoup来解析它。
将它转换为BeautifulSoup对象没有问题,但我很难找到该元素。以ATOM文档的一段为例:
from bs4 import BeautifulSoup
feed = """
<cse:DataObject type="cse_thumbnail">
<cse:Attribute name="width" value="160"/>
<cse:Attribute name="height" value="160"/>
<cse:Attribute name="src" value="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRAUAShHrU8LK9MLEMEcfg-rtYgLzaxUP-j30lNJJdP1P6FBdVIziH4LTY"/>
</cse:DataObject>
"""
soup = BeautifulSoup(feed)
print soup.find_all("cse:Attribute", {"value":"160"})
...它返回一个空列表。我做错了什么?
答案 0 :(得分:1)
您编写的代码将XML解析为HTML,并且因为HTML不区分大小写,所以BeautifulSoup converts all tag names to lowercase:
因为HTML tags and attributes are case-insensitive,所有三个HTML解析器都将标记和属性名称转换为小写。也就是说,标记
<TAG></TAG>
将转换为<tag></tag>
。如果您想保留大小写或大写的标签和属性,则需要parse the document as XML。
搜索标签的小写版本可以正常工作:
>>> soup.find_all("cse:attribute", {"value":"160"})
[<cse:attribute name="width" value="160"></cse:attribute>,
<cse:attribute name="height" value="160"></cse:attribute>]
正如引用文本所提到的,另一种方法是使用XML解析器,它将保留大小写。但是,带有lxml解析器的BeautifulSoup会从标记名称中删除名称空间...
>>> soup = BeautifulSoup(feed, "xml")
>>> soup
<?xml version="1.0" encoding="utf-8"?>
<DataObject type="cse_thumbnail">
<Attribute name="width" value="160"/>
<Attribute name="height" value="160"/>
<Attribute name="src" value="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRAUAShHrU8LK9MLEMEcfg-rtYgLzaxUP-j30lNJJdP1P6FBdVIziH4LTY"/>
</DataObject>
>>> soup.find_all("cse:Attribute", {"value":"160"})
[]
>>> soup.find_all("cse:attribute", {"value":"160"})
[]
>>> soup.find_all("Attribute", {"value":"160"})
[<Attribute name="width" value="160"/>,
<Attribute name="height" value="160"/>]
......这可能不是你想要的。