Estoy tratando de anular el mensaje AttributeError, para que no me dé el mensaje de error y simplemente continúe con el script. El script encuentra e imprime el nombre de office_manager, pero en algunas ocasiones no hay un administrador en la lista, por lo que necesito ignorar esas ocasiones. ¿Alguien puede ayudar?

for office_manager in soup.find(text="Office_Manager").findPrevious('h4'):
    try:
        print(office_manager)
    except AttributeError:
        continue
    finally:
        print("none")
0
Miss Pepper 10 may. 2019 a las 15:39

3 respuestas

La mejor respuesta

Con bs4 4.7.1. puedes usar :contains, :has and :not. Lo siguiente imprime los nombres de los directores (si no hay directores, obtendrá una lista vacía)

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://beta.companieshouse.gov.uk/company/00930291/officers')
soup = bs(r.content, 'lxml')
names = [item.text.strip() for item in soup.select('[class^=appointment]:not(.appointments-list):has([id^="officer-role-"]:contains(Director)) h2')]
print(names)
0
QHarr 10 may. 2019 a las 15:34

Pensé que alguien menos perezoso que yo convertiría mi comentario en una respuesta, pero como no, aquí tienes:

for office_manager in soup.find(text="Office_Manager").findPrevious('h4'):
    try:
        print(office_manager)
    except AttributeError:
        pass
    finally:
        print("none")

Usar pass omitirá la entrada en su lugar.

-1
Nordle 10 may. 2019 a las 12:46

Dado que el error vino de .find, entonces debería ser el que esté en la captura de prueba, o incluso mejor, debería ser así.

try:
    office_manager = soup.find(text="Office_Manager").findPrevious('h4')
except AttributeError as err:
    print(err) # or print("none")
    pass # return or continue
else:
   for title in office_manager:
       print(title)
1
Lei 7 nov. 2019 a las 00:59