如何在ATOM XML文档中搜索混合大小写标记名称?

时间:2015-04-23 21:45:07

标签: python xml web-scraping beautifulsoup atom-feed

我正在使用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"})

...它返回一个空列表。我做错了什么?

1 个答案:

答案 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"/>]

......这可能不是你想要的。