【发布时间】:2014-08-27 15:51:42
【问题描述】:
所以我想给那些漂亮的汤标签添加一个标签。 但是,使用此代码,只有列表的最后一个标签会保留添加的标签。以前的标签将在迭代期间拥有它,然后会丢失它。更改不是持久的。
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 只是为了完成一个简单的操作时,我想可能是做错了什么。
那么你通常如何获取对象列表,修改它们,并返回一个包含修改对象的列表?这种常见的任务一定有更简单的方法
【问题讨论】:
-
什么意思?我想我已经只做了一个循环,对吧?
-
当然!我在问题中添加了它
-
它认为它不会,但这不是问题,因为我总是可以使用 find() 并得到它。问题是它并不适用于列表的所有 3 个元素。只有最后一个。我三个都需要它
-
我猜想将 BeautifulSoup 元素添加到另一个元素会将其从添加的其他任何地方删除。也就是说,您的
p值一次只能包含在soupNdiv 之一中。 -
@Danny,我加了一个答案,你每次都需要创建一个新的
p对象
标签: python list beautifulsoup deep-copy