使用 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 nth-of-type 返回空列表。 Soup.select()[n -1] 返回元素。为啥?