2016-10-18 1 views
1

Предположим, что у меня есть следующие html:Исключить элемент из веб-Царапины Loop

<h4> 
    <a href="http://www.google.com">Google</a> 
</h4> 
<h4>Random Text</h4> 

Я в состоянии идентифицировать все h4 заголовки с помощью цикла, такие как:

for url in soup.findAll("h4") 
    print(url.get_text()) 

И что работает хорошо, за исключением он включает элемент «случайный текст» в заголовке h4. Можно ли программно удалить вхождения заголовков h4, которые не соответствуют определенным критериям - например, те, которые не содержат ссылки?

ответ

3

Конечно, вы можете пойти с простым подходом, просто фильтрацией заголовков:

for url in soup.find_all("h4") 
    if not url.a: # "url.a" is a shortcut to "url.find('a')" 
     continue 
    print(url.get_text()) 

Или, лучше всего было бы, чтобы фильтровать их с function:

for url in soup.find_all(lambda tag: tag.name == "h4" and tag.a): 
    print(url.get_text()) 

Или, даже лучше, идти прямо к a элементов:

for url in soup.select("h4 > a"): 
    print(url.get_text()) 

h4 > a вот CSS selector, который будет соответствовать a элементам, которые являются прямыми детьми h4 тегов.

+0

Или 'если url.a: печать (url.get_text())' –

0

Использование списка понимание как самый вещий подход:

[i.get_text() for i in soup.findAll("h4") if #Insert criteria here#] 
+1

При использовании списка понимание хорошо и применим в данном случае, это не отвечает на вопрос, о котором спрашивает OP. Пусть этот ответ будет комментарием imho. – alecxe

+0

Какая часть вопроса не отвечает? –

+1

Хорошо, не обижайтесь здесь, конечно, но где в ответе вы фильтруете заголовки, которые не содержат ссылок? – alecxe

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