使用BeautifulSoup更改元素值将返回空元素

Weh*_*olt 3 python xml parsing beautifulsoup

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>
Run Code Online (Sandbox Code Playgroud)

如何更改元素的内容,在这种情况下是变量"make"中的元素,而不会丢失内容?如果您能指出我可以修改现有xml文档的其他纯python模块,请告诉我.

PS!BeautifulSoup非常适合HTML和XML的屏幕分析和解析!

Pao*_*ino 10

查看文档replaceWith.这有效:

make.contents[0].replaceWith('Top of the world Ma!')
Run Code Online (Sandbox Code Playgroud)


har*_*r07 5

使用 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>
Run Code Online (Sandbox Code Playgroud)

这种方法非常适合元素包含其他元素并且您想要用新元素替换整个内容的情况:

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

print parent
# prints <parent>Top of the world Ma!</parent>
Run Code Online (Sandbox Code Playgroud)

我刚才遇到了这个相当老的问题,并且提供的解决方案不太适合我。进一步的研究使我想到了上述方法,我认为分享我最终在这里使用的方法可能有用。