2014-02-04 3 views
1

Я пытаюсь получить все атрибуты XML для тега Name.BeautifulSoup raise AttributeError, когда имя тега 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", а затем он работает.

Почему я получаю эту ошибку, когда имя тега содержит заглавные буквы?

ответ

3

BeautifulSoup - это библиотека HTML-анализа, в первую очередь. Он также может обрабатывать XML, но все теги располагаются ниже по спецификации HTML. Цитирование в BeautifulSoup documentation:

Because HTML tags and attributes are case-insensitive, all three HTML parsers convert tag and attribute names to lowercase. That is, the markup <TAG></TAG> is converted to <tag></tag> . If you want to preserve mixed-case or uppercase tags and attributes, you’ll need to parse the document as 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) 
+0

Спасибо. Как получить атрибут для тега 'Product'? –

+1

@ Нихо: см. Интерфейс ['Элемент'] (http://docs.python.org/2/library/xml.etree.elementtree.html#element-objects); используйте 'root.get ('Code')' например. –

0

В BeautifulSoup 4, вы можете использовать

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

Это должно работать.

Смежные вопросы