Попытка заменить тег ‹em› на ‹a›

import requests
import string
from bs4 import BeautifulSoup, Tag
[...]
def disease_spider(maxpages):
    i = 0
while i <= maxpages:
    url = 'http://www.cdc.gov/DiseasesConditions/az/'+ alpha[i]+'.html'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text)
    for l in soup.findAll('a', {'class':'noLinking'}):
        x =l.find("em")
        if x is not None:
            return x.em.replaceWith(Tag('a'))

    i += 1

Некоторый текст с веб-сайта использует теги вместо тегов, и я хотел заменить их тегами. Используя этот код, я получаю эту ошибку:

AttributeError: объект «NoneType» не имеет атрибута «replaceWith»


person ks4929    schedule 28.06.2015    source источник


Ответы (1)


Насколько я понимаю, вы хотите заменить em своим текстом.

Другими словами, элемент a, содержащий:

<a class="noLinking" href="http://www.cdc.gov/hi-disease/index.html">
    including Hib Infection (<em>Haemophilus influenzae</em> Infection)   
</a>

следует заменить на:

<a class="noLinking" href="http://www.cdc.gov/hi-disease/index.html">
    including Hib Infection (Haemophilus influenzae Infection) 
</a>

В этом случае я бы разместил все теги em непосредственно под тегами a и для каждого найденного тега em заменил его текстом, используя replace_with():

for em in soup.select('a.noLinking > em'):
    em.replace_with(em.text)

В качестве примечания, замена может не понадобиться, потому что .text тега a даст вам полный текст узла, включая его дочерние элементы:

In [1]: from bs4 import BeautifulSoup

In [2]: data = """
   ...:     <a class="noLinking" href="http://www.cdc.gov/hi-disease/index.html">
   ...:         including Hib Infection (<em>Haemophilus influenzae</em> Infection)   
   ...:     </a>
   ...: """

In [3]: soup = BeautifulSoup(data)

In [4]: print soup.a.text

        including Hib Infection (Haemophilus influenzae Infection)   
person alecxe    schedule 28.06.2015
comment
Можно ли найти все теги с тегом списка? - person ks4929; 28.06.2015
comment
@ks4929 да. Замените a.noLinking > em, например, на li a.noLinking > em. - person alecxe; 28.06.2015