Если я использую метод extract () BeautifulSoup в списке A, он извлечет то же самое в другом списке B (копия A) с другим идентификатором

Посмотрите на этот пример:

listA = [BeautifulSoup('<a href="http://example.com/">I linked to <i>example.com</i></a>')]

Затем я создаю его копию:

listB=listA[:]

ОК, оба списка равны, но имеют разные идентификаторы. Когда я добавляю somenting в один список, он не будет добавляться в его копию. Но когда я использую метод extract() в listB, например, как это:

listB[0].i.extract()

Он извлечет тот же тег в listA, который имеет другой идентификатор listB.

Так:

listA

#[<a href="http://example.com/">I linked to </a>]

Почему это происходит и есть ли какое-то решение?

РЕДАКТИРОВАТЬ:

После поиска более подробно об этой проблеме, найден метод deepcopy () из copy module. Поэтому я проверил его на своем примере, и он работал хорошо.
В оболочке:

>>> import copy
>>> listB=copy.deepcopy(listA)
>>> listB[0].i.extract()
>>> listA
#[<a href="http://example.com/">I linked to <i>example.com</i></a>]

Работал в этом простом примере, но в моем коде он немного отличается, как показано ниже:

soup = BeautifulSoup(page.content)
resp = soup.find_all('blockquote', {'class':'postMessage'})

listA = []
for i in range(len(resp)):
    if len(resp[i].findAll('a', {'onclick':"highlightReply('19176591');"})) != 0:
        if resp[i] not in listA:
            listA.append(resp[i])
listB = copy.deepcopy(listA)

И когда я запускаю его, код ломается безумно, как это:

Traceback (most recent call last):
  File "C:Python34request.py", line 47, in <module>
    listB=copy.deepcopy(listA)
  File "C:Python34libcopy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "C:Python34libcopy.py", line 219, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "C:Python34libcopy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "C:Python34libcopy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)
  File "C:Python34libcopy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "C:Python34libcopy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "C:Python34libcopy.py", line 182, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "C:Python34libcopy.py", line 300, in _reconstruct
    state = deepcopy(state, memo)

... (a lot of times repeating those ones)

  File "C:Python34libcopy.py", line 155, in deepcopy
    y = copier(x, memo)
  File "C:Python34libcopy.py", line 246, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "C:Python34libcopy.py", line 164, in deepcopy
    copier = getattr(x, "__deepcopy__", None)
RuntimeError: maximum recursion depth exceeded

1 ответ

  1. Ну, я сделал Клудж, чтобы решить эту проблему.

    Просто понравилось:

    for i listA:
        listB.append(BeautifulSoup(str(i)))
    

    Он копирует полностью неразделенный список. Я не знаю, есть ли лучшее решение для моего случая.