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

Posted

技术标签:

【中文标题】使用 BeautifulSoup 更改元素值会返回空元素【英文标题】:Changing element value with BeautifulSoup returns empty element 【发布时间】:2010-10-17 05:13:45 【问题描述】:
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”中的元素?如果您能指出其他可以修改现有 xml 文档的纯 python 模块,请告诉我。

PS! BeautifulSoup 非常适合 html 和 XML 的屏幕抓取和解析!

【问题讨论】:

【参考方案1】:

查看documentation on replaceWith。这有效:

make.contents[0].replaceWith('Top of the world Ma!')

【讨论】:

我在文档中没有看到我的 2 美分,但似乎变量“make”只指向找到满足此条件的第一个元素 make = soup.find('foo:bar') .当这个变量被 replaceWith() 修改时,原始的 xml_data 字符串反映了这个变化。出于某种原因,我认为字符串 xml_data 是不可变的。这很好。【参考方案2】:

使用 BeautifulSoup 版本 4 (bs4),您可以直接通过 updating string property 实现相同的效果:

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>

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

【讨论】:

以上是关于使用 BeautifulSoup 更改元素值会返回空元素的主要内容,如果未能解决你的问题,请参考以下文章

如何用 BeautifulSoup 更改标签名称?

BeautifulSoup nth-of-type 返回空列表。 Soup.select()[n -1] 返回元素。为啥?

BeautifulSoup的选择器

python学习——Beautifulsoup 模块

Chrome 表单重置不更改显示选择元素

如何用 BeautifulSoup 抓取 Instagram