【问题标题】:how to modify objects from a list and return them in a new list如何修改列表中的对象并将它们返回到新列表中
【发布时间】: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 值一次只能包含在 soupN div 之一中。
  • @Danny,我加了一个答案,你每次都需要创建一个新的p对象

标签: python list beautifulsoup deep-copy


【解决方案1】:
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('&lt;p&gt;foo&lt;/p&gt;').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

【讨论】:

  • @Danny,这是什么意思?为什么不能每次都创建一个新实例?
  • 我将接收 p 作为函数的参数。所以,在它通过之前,我不知道它是什么样子的。
  • 它来自哪里?
  • p 通常来自另一个函数。但我正在尝试编写一个通用函数。为了清楚起见,我保持这个例子简单,而不是复制和粘贴太多代码......但一般来说我不会设置输入(所以我不能提前知道 p 必须是'

    foo

    ' 直到我读到它..) 我只能写一个足够好的函数来处理任何标签
  • 我开始认为您的设计存在根本缺陷,您应该创建新对象,该函数究竟做了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多