所以我正在尝试为那些美丽的汤标签添加标签。 但是,使用此代码,列表的最后一个标记将保留添加的标记。以前的标签会在迭代期间使用它,然后会失去它。变化不是持久的。
import bs4
def add_tag(souplist, p):
newlist = []
for div in souplist:
div.append(p) # beautiful soup append
newlist.append(div) # list append
return newlist
输入
soup1 = bs4.BeautifulSoup('<html><body><div>a</div></body></html>').find('div')
soup2 = bs4.BeautifulSoup('<html><body><div>b</div></body></html>').find('div')
soup3 = bs4.BeautifulSoup('<html><body><div>c</div></body></html>').find('div')
souplist = [soup1, soup2, soup3]
p = bs4.BeautifulSoup('<p>foo</p>').find('p')
refinedlist = add_tag(souplist, p)
输出
我期待精制列表的输出:
>>> [<div>a<p>foo</p></div>, <div>b<p>foo</p></div>, <div>c<p>foo</p></div>]
但是我得到了这个
>>> [<div>a</div>, <div>b</div>, <div>c<p>foo</p></div>]
注意:如果做了
newlist.append(deepcopy(div)) # list append
它可以工作,但是对于足够大的对象,它会触发“超出最大递归限制......”异常,这可以通过将此参数设置为(更高)更高的值来避免。但是当你看到自己修改sys参数并使用deepcopy只是为了完成一个简单的操作时,我想可能有些事情做错了。
那么你如何获得一个对象列表,修改它们,并返回一个包含修改过的对象的列表?这种共同任务必须有一种更简单的方法
答案 0 :(得分:0)
final = []
souplist = [soup1, soup2, soup3]
for s in souplist:
p = bs4.BeautifulSoup('<p>foo</p>').find('p')
s.append(p)
final.append(s)
print(final)
[<div>a<p>foo</p></div>, <div>b<p>foo</p></div>, <div>c<p>foo</p></div>]
您需要为每个附加内容创建一个新的p = bs4.BeautifulSoup('<p>foo</p>').find('p')
对象
def add_tag(souplist, p):
newlist = []
for div in souplist:
p = bs4.BeautifulSoup('<p>foo</p>').find('p')
div.append(p) # beautiful soup append
newlist.append(div) # list append
return newlist