Как повысить эффективность с помощью нескольких операторов IF Python - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть 3 оператора if, и они действительно уродливы с точки зрения стиля и эффективности.

Они анализируют HTML с BS4. HTML в переменной example_post. Если элемент существует -> получить текст. Если не существует -> назначить «Нет» в качестве строки.

if example_post.find('span', class_='tag1'):
    post_reactions = example_post.find('span', class_='tag1').getText()
else:
    post_reactions = 'None'


if example_post.find('span', class_='tag2'):
    post_comments = example_post.find('span', class_='tag2').getText()
else:
    post_comments = 'None'

if example_post.find('span', class_='tag3'):
    post_shares = example_post.find('span', class_= 'tag3').getText()
else:
    post_shares = 'None'

Я начал гуглить, как его улучшить, и обнаружил, что можно использовать словари с заявления

таким образом, дикт попробовал вот так

post_titles = []
post_values = []

for key,value in post_reactions_dict.items():
    if example_post.find('span', class_=key):
        post_values.append(example_post.find('span', class_=key).getText())
        post_titles.append(key)
    else:
        post_titles.append(key)
        post_values.append('None')

Это нормально, но, возможно, можно сделать это еще лучше?

Идеальный результат:

post_titles = ['post_reactions', 'post_comments', 'post_shares']
post_values (it depends) but for the question ['None', 'None', 'None']

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Я бы предложил сделать это немного более обобщенным c и избегать использования исключений в качестве "нормального" потока программы:

def get_span(element,class_):
    tag = element.find('span', class_=class_)
    return None if tag is None else tag.getText()

post_reactions = get_span(example_post,'tag1')
post_comments  = get_span(example_post,'tag2')
post_share     = get_span(example_post,'tag3')
0 голосов
/ 06 апреля 2020

Я предполагаю, что метод .find () возвращает класс или None? Если это так, мой подход без каких-либо, если:

def get_text(class_):
    try:
        return example_post.find('span', class_=class_).getText()
    except AttributeError:
        return 'None'

 post_reactions = get_text('tag1')
 post_comments = get_text('tag2')
 post_share = get_text('tag3')
0 голосов
/ 06 апреля 2020
post = {}
attributes = ('reactions', 'tag1'), ('comments', 'tag2'), ('shares', 'tag3')

for attribute, tag in attributes:
    try:
        post[attribute] = example_post.find('span', class_=tag).getText()
    except AttributeError:
        post[attribute] = None
  1. Не используйте отдельные переменные, используйте dict для хранения данных.
  2. Выясните, каковы переменные (различия между вашим повторным кодом); в этом случае это просто post_* и tag*, объедините их в пары данных, как данные.
  3. Не повторяйте вызов example_post.find(...); здесь мы используем тот факт, что .getText(), скорее всего, вызовет AttributeError, если find() вернет None / False / что бы это ни было, оно вернется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...