【问题标题】:BeautifulSoup raise AttributeError when xml tag name contains capital letters当 xml 标签名称包含大写字母时,BeautifulSoup 引发 AttributeError
【发布时间】:2014-02-28 23:34:51
【问题描述】:

我正在尝试获取标签 Name 的所有 XML 属性。

得到这个错误:

AttributeError: 'NoneType' object has no attribute 'attrs'

当我执行以下代码时:

import BeautifulSoup as bs

xml = '''
<Product Code="1" HighPic="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Linksys48portswitch.jpg/220px-Linksys48portswitch.jpg" HighPicHeight="320" HighPicSize="37217" HighPicWidth="400" ID="35" Title="Demo Product">
<Category ID="23">
<Name ID="57" Value="Switches" langid="1"/>
</Category>
</Product>'''

doc = bs.BeautifulSoup(xml)
div = doc.find("Name")

for attr, val in div.attrs:
    print "%s:%s" % (attr, val)

我将标签"Name" 更改为"name",然后它就可以工作了。

为什么标签名称包含大写字母时会出现此错误?

【问题讨论】:

    标签: python xml google-app-engine beautifulsoup


    【解决方案1】:

    BeautifulSoup 主要是一个 HTML 解析库。它也可以处理 XML,但根据 HTML 规范,所有标签都是小写的。引用BeautifulSoup documentation

    由于 HTML 标记和属性不区分大小写,所有三个 HTML 解析器都将标记和属性名称转换为小写。也就是说,标记&lt;TAG&gt;&lt;/TAG&gt; 被转换为&lt;tag&gt;&lt;/tag&gt;。如果您想保留大小写混合或大写的标签和属性,您需要将文档解析为 XML。

    有一个XML modus,其中标签区分大小写且不小写,但这需要安装lxml 库。因为lxml 是一个 C 扩展库,所以 Google App Engine 不支持。

    请改用ElementTree API

    import xml.etree.ElementTree as ET
    
    root = ET.fromstring(xml)
    div = root.find('.//Name')
    
    for attr, val in div.items():
         print "%s:%s" % (attr, val)
    

    【讨论】:

    • 谢谢。如何获取Product 标签的属性?
    • @Nijo:见Element interface;以root.get('Code') 为例。
    【解决方案2】:

    在 BeautifulSoup 4 中,您可以使用

    doc = bs.BeautifulSoup(xml, "xml")
    div = doc.find("Name")
    

    这应该可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多