2012-08-13 5 views
0

Я пытаюсь разобрать xml с помощью BeautifulSOup, но это приводит к неправильному выводу.BeautifulSoup не читает теги должным образом

file.xml:

<?xml version="1.0" ?> 
<opening name="value1" > 
     <element name="value1.1"/> 
     <element name="value1.2"> 
     <element name="1.2.1"/> 
     </element> 
     <element name="value1.3"> 
     <element name="value1.3.1"/> 
     </element> 
</opening> 

используя следующий код:

>>> a=open('file.xml').read() 
>>> import BeautifulSoup 
>>> s= BeautifulSoup.BeautifulSoup(a) 
>>> print s.prettify() 

и я получаю следующий результат:

<?xml version='1.0' encoding='utf-8'?> 
<opening name="value1"> 
<element name="value1.1"> 
</element> 
<element name="value1.2"> 
</element> 
<element name="1.2.1"> 
</element> 
<element name="value1.3"> 
</element> 
<element name="value1.3.1"> 
</element> 
</opening> 

Почему это показывает все элементы, как ребенок открытия тег ? Как правильно проанализировать этот файл?

Я пробовал использовать s = BeautifulSoup.BeautifulStoneSoup (a) также, но это тоже не сработало.

+1

Я подтвердил вашу проблему с BeautifulSoup3. Проблема, похоже, исправлена ​​в BeautifulSoup4. Установите BeautifulSoup4. –

+0

BeautifulSoup4 Работал для меня. Спасибо @StevenRumbalski –

ответ

1

BeautifulSoup - это, прежде всего, парсер HTML, который старается лучше всего справиться с HTML-кодом. Существуют библиотеки XML, такие как lxml, которые я очень рекомендую - попробуйте это.

Пример:

import lxml.etree 

xml = """<?xml version="1.0" ?> 
<opening name="value1" > 
     <element name="value1.1"/> 
     <element name="value1.2"> 
     <element name="1.2.1"/> 
     </element> 
     <element name="value1.3"> 
     <element name="value1.3.1"/> 
     </element> 
</opening> 
""" 

r = lxml.etree.fromstring(xml) 
r.xpath('//element/@name') 
# ['value1.1', 'value1.2', '1.2.1', 'value1.3', 'value1.3.1'] 
+2

Если вы все еще хотите функциональность, предоставляемую BeautifulSoup, тогда вы можете просто указать, что он использует XML-парсер, а не ie. 'BeautifulSoup (markup," xml ")' - для этого требуется 'lxml'. – Dunes

0

Beautiful Soup 3 требует особого аргумента, чтобы получить теги, чтобы закрыть должным образом. Вам нужен аргумент selfClosingTags для конструктора BeautifulStoneSoup. Используйте что-то вроде:

soup = BeautifulStoneSoup(markup, selfClosingTags=['element']) 
Смежные вопросы