Изменение значения элемента с помощью BeautifulSoup возвращает пустой элемент - PullRequest
3 голосов
/ 03 апреля 2009
from BeautifulSoup import BeautifulStoneSoup

xml_data = """
<doc>
  <test>test</test>
  <foo:bar>Hello world!</foo:bar>
</doc>
"""

soup = BeautifulStoneSoup(xml_data)
print soup.prettify()
make = soup.find('foo:bar')
print make
# prints <foo:bar>Hello world!</foo:bar>

make.contents = ['Top of the world Ma!']
print make
# prints <foo:bar></foo:bar>

Как изменить содержимое элемента, в этом случае элемент в переменной «make», не теряя содержимое? Если вы могли бы указать мне на другие чистые модули Python, которые могут изменять существующие xml-документы, пожалуйста, сообщите мне.

PS! BeautifulSoup отлично подходит для скрининга и анализа как HTML, так и XML!

Ответы [ 2 ]

10 голосов
/ 03 апреля 2009

Ознакомьтесь с документацией на replaceWith. Это работает:

make.contents[0].replaceWith('Top of the world Ma!')
2 голосов
/ 30 апреля 2015

Используя BeautifulSoup версии 4 (bs4), вы можете добиться того же самого путем обновления string свойства напрямую:

from bs4 import BeautifulSoup

xml_data = """
<doc>
  <test>test</test>
  <foo:bar>Hello world!</foo:bar>
  <parent>Hello <child>world!</child></parent>
</doc>
"""

soup = BeautifulSoup(xml_data)
make = soup.find('foo:bar')

make.string = 'Top of the world Ma!'
print make
# prints <foo:bar>Top of the world Ma!</foo:bar>

Этот подход хорошо работает для случая, когда элемент содержит другие элементы, и вы хотите заменить весь контент новым:

parent = soup.find('parent')
parent.string = 'Top of the world Ma!'

print parent
# prints <parent>Top of the world Ma!</parent>

Я наткнулся на этот довольно старый вопрос только сейчас, и предложенное решение не совсем подходит для меня. Дальнейшие исследования приводят меня к вышеупомянутому подходу, и я подумал, что, возможно, было бы полезно поделиться тем, что я в итоге использовал здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...