BeautifulSoup: вернуть None, если элемент HTML не найден - PullRequest
0 голосов
/ 03 июня 2018

Я использую BeautifulSoup для поиска нескольких элементов на веб-странице.

Я сохраняю найденные элементы, но, поскольку есть вероятность, что мой скрипт будет искать элемент, а он не существует для конкретной страницы, которую он анализирует, у меня есть операторы try / исключением для каждогоэлемент:

# go through a bunch of webpages
for soup in soups:
    try: # look for HTML element
         data['val1'].append(soup.find('div', class_="something").text)
    except: # add NA if nothing found
        data['val1'].append("N/A")
    try:
        data['val2'].append(soup.find('span', class_="something else").text)
    except:
        data['val2'].append("N/A")

    # and more and more try/excepts for more elements of interest

Есть ли более чистый или лучший способ написать что-то подобное?

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Согласно документации о методе поиска .Он вернет None, если ничего не сможет найти.Таким образом, Исключение возникает, когда вы вызываете свойство text для None.

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

result = soup.find('div', class_="something")
data['val1'].append(result.text if result else "N/A")

Также, как отметил Дэн-Дев, отлов исключения является дорогостоящим :

Блок try / исключения чрезвычайно эффективен, если не генерируются исключения.На самом деле ловить исключение дорого.

0 голосов
/ 03 июня 2018

Это позволяет добиться того, что вы хотите, а также немного сократить повторение кода, заключая все в цикл for:

info= [("val1", "div", "something"),
       ("val2", "span", "something else")]

# go through a bunch of webpages
for soup in soups:
    for (val, element, class1) in info:
        query = soup.find(element, class_=class1)
        data[val].append(query.text if query else "N/A")
0 голосов
/ 03 июня 2018

Попробуйте, кроме как дорого.Я бы использовал оператор if else.

v = soup.find('div', class_="something")
if v:
    data['val1'].append(v.text)
else:
    data['val1'].append("N/A")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...