Как я могу получить доступ к пространственным элементам имен XML, используя BeautifulSoup? - PullRequest
8 голосов
/ 17 июня 2010

У меня есть XML-документ, который выглядит так:

<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>

Мой вопрос: как мне получить к ним доступ, используя библиотеку вроде BeautifulSoup в python?

xmlDom.web ["Web"]. Всего?не работает?

Ответы [ 3 ]

10 голосов
/ 17 июня 2010

BeautifulSoup не является библиотекой DOM как таковой (она не реализует API DOM). Чтобы сделать вещи более сложными, вы используете пространства имен в этом фрагменте XML. Чтобы проанализировать этот конкретный фрагмент XML, вы должны использовать BeautifulSoup следующим образом:

from BeautifulSoup import BeautifulSoup

xml = """<xml>
  <web:Web>
    <web:Total>4000</web:Total>
    <web:Offset>0</web:Offset>
  </web:Web>
</xml>"""

doc = BeautifulSoup( xml )
print doc.find( 'web:total' ).string
print doc.find( 'web:offset' ).string

Если вы не используете пространства имен, код может выглядеть следующим образом:

from BeautifulSoup import BeautifulSoup

xml = """<xml>
  <Web>
    <Total>4000</Total>
    <Offset>0</Offset>
  </Web>
</xml>"""

doc = BeautifulSoup( xml )
print doc.xml.web.total.string
print doc.xml.web.offset.string

Ключевым моментом здесь является то, что BeautifulSoup ничего не знает (или не заботится) о пространствах имен. Таким образом, web:Web обрабатывается как тег web:web вместо тега Web, принадлежащего пространству имен web. В то время как BeautifulSoup добавляет web:web в словарь элементов xml, синтаксис python не распознает web:web как один идентификатор.

Подробнее об этом можно прочитать, прочитав документацию .

6 голосов
/ 23 февраля 2016

Это старый вопрос, но кто-то может не знать, что, по крайней мере, BeautifulSoup 4 хорошо хорошо обрабатывает пространства имен, если вы передаете 'xml' в качестве второго аргумента конструктору:

soup = BeautifulSoup("""<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>""", 'xml')

print soup.prettify()
<?xml version="1.0" encoding="utf-8"?>
<xml>
 <Web>
  <Total>
   4000
  </Total>
  <Offset>
   0
  </Offset>
 </Web>
</xml>
0 голосов
/ 01 июня 2016

Вы должны явно определить свое пространство имен для корневого элемента, используя синтаксис xmlns:prefix="URI" ( см. Примеры здесь ), а затем вы получите доступ к своему атрибуту через prefix:tag из BeautifulSoup. Имейте в виду, что вы также должны явно определить, как BeautifulSoup должен обрабатывать ваш документ, в этом случае:

xml = BeautifulSoup (xml_content, 'xml')

...