Попытка заменить тег <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'

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)   
Другие вопросы по тегам