2015-01-02 2 views
1

Я ищу строки, которые либо "up", либо "down" в исходном HTML-коде. Только одним словом работает код. Но если бы я хотел искать строки, содержащие несколько слов, как это сделать в Python 3.4.2?Как искать несколько слов, используя lambda

links = lambda tag: getattr(tag, 'name', None) == 'a' and 'up|down' in tag.get_text().lower() and 'href' in tag.attrs 
+0

я должен предоставить больше информации? – sandy

+0

Ваш код _have_ находится в 'лямбда'? –

+0

@ PM2Ring он должен быть внутри функции, см. Http://stackoverflow.com/questions/27730041/how-to-extract-html-links-with-a-matching-word-from-a-website-using- питон. – alecxe

ответ

1

Вы всегда можете сделать регулярную функцию вместо короткого lambda формы.

Определить список слов, которые вы хотите проверить в тексте tag «s и использовать any() + in, чтобы проверить наличие слова внутри текста:

stop_words = ['up', 'down'] 
def filter_links(tag): 
    if getattr(tag, 'name', None) == 'a' and 'href' in tag.attrs: 
     text = tag.get_text().lower() 
     return any(item in text for item in stop_words) 
    return False 
0

Вы можете использовать re.search для поиска для список слов

lambda tag: (getattr(tag, 'name', None) == 'a' and 
      re.search("up|down", tag.get_text().lower()) and 
      'href' in tag.attrs) 

Обратите внимание, что, однако, например "downsize" также соответствуют в этом случае. Если вы хотите, отдельное слово up или down присутствовать выражение:

re.search("\\b(up|down)\\b", ...) 

потому что \b средства в этом контексте «граница слова»

+0

Должно быть обратное к нему 'вверх' или' вниз' внутри текста. – alecxe

+0

@alecxe: спасибо, исправлено – 6502

+0

@alecxe: 're' модуль уже выполняет кэширование скомпилированных выражений внутри, я бы не угадал код, если не доказал свою эффективность. – 6502

Смежные вопросы