2014-08-27 64 views
-1

所以我试图给这些美丽的汤姆标签添加标签。 但是,使用此代码时,只有列表的最后一个标记会保留添加的标记。以前的标签会在迭代过程中出现,然后会丢失。变化不是持久的。如何修改列表中的对象并将它们返回到新列表中

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) 

输出

我期待这个输出refinedlist:

>>> [<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

你是什么意思?我想我只做一个循环,对吧? – Danny 2014-08-27 15:57:33

+0

当然!我在 – Danny 2014-08-27 16:05:45

+0

这个问题中加入了它,但它不是问题,因为我总是可以使用find()并获取它。问题在于它不会持续列表中的所有3个元素。只有最后一个。我需要它在所有三个 – Danny 2014-08-27 16:43:40

回答

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 
+0

ok,但该对象将被传递给函数 – Danny 2014-08-27 16:59:04

+0

@Danny,这是什么意思?为什么你不能每次都创建一个新实例? – 2014-08-27 16:59:42

+0

我将收到p作为函数的参数。所以,我不知道它是什么样子,直到它通过。 – Danny 2014-08-27 17:00:58

相关问题