2014-01-13 3 views
2

Я очищаю веб-страницу, которая не использует полезные классы или идентификаторы в своих тегах html, поэтому мне приходится отказаться от всех ссылок и искать шаблоны в ссылках. Вот как пример HTML может выглядетьВыполнение нескольких операторов if менее подробных

<span>Category</span><link href='example.com/link-about-a'>A</a> 

На другой странице мы могли бы иметь другую категорию

<span>Category</span><link href='example.com/link-about-b'>B</a> 

Использование beautifulsoup4, мое текущее решение выглядит следующим образом

def category(soup): 
    for x in soup.find_all('a'): 
     if 'link-about-a' in x['href']: 
      return 'A' 
     if 'link-about-b' in x['href']: 
      return 'B' 

и так на .. но это очень уродливо.

Мне интересно, есть ли способ сделать это менее подробным.

Как с использованием словаря

categories = {'A': 'link-about-a', 'B': 'link-about-b'} 

и сведя его к одному выражению.

+0

Насколько предсказуемы шаблоны в ссылках? Если совпадение подстроки - единственный способ найти шаблоны, решение Эрика - это хорошо. Я лично мог бы использовать кортеж кортежей, а не dict для чего-то, что я просто повторяю как пары ключ/значение, но это тривиальное различие. Однако, если вы можете надежно извлечь шаблон с чем-то вроде регулярного выражения, то лучше всего использовать словарь, который отображает шаблоны в категории. –

+0

@PeterDeGlopper Шаблон предсказуем и из предопределенного списка категорий (A, B, C ...), поэтому вы правы, и я нашел реализацию регулярного выражения более полезной. Благодарю. – yayu

ответ

5

Все, что вам нужно, это еще один цикл:

for x in soup.find_all('a'): 
    for k, v in categories.iteritems(): 
     if v in x['href']: 
      return k 

Хотя, если вы хотите одно выражение:

category = next((
    k for x in soup.find_all('a') 
     for k, v in categories.iteritems() 
     if v in x['href'] 
), None) 
1

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

categories = [[re.compile('link-about-a'), 'A'], 
       [re.compile('link-about-b'), 'B']] 

def category(soup): 
    for x in soup.findAll('a'): 
     for expression, description in categories: 
      if expression.search(x['href']): 
       return description 
    else: 
     return None 
Смежные вопросы