2017-01-20 3 views
0

У меня есть ссылки в HTML видаКакая красивая супная строка regex для использования?

<a href="/downloadsServlet?docid=abc" target="_blank">Report 1</a> 
<a href="/downloadsServlet?docid=ixyz" target="_blank">Fetch Report 2 </a> 

Я могу получить список ссылок вышеуказанной формы с использованием BeautifulSoup

Мой код выглядит следующим образом

from bs4 import BeautifulSoup 
html_page = urllib2.urlopen(url) 
soup = BeautifulSoup(html_page) 
listOfLinks = list(soup.findall('a')) 

Однако, Я хочу найти ссылки, которые имеют слово «Fetch» ​​в тексте, ссылающемся на ссылку.

Я попробовал форму

soup.findAll('a', re.compile(".*Fetch.*")) 

Но это не работает. Как выбрать только теги a, у которых есть href, а текстовая часть имеет в нем слово «Fetch»?

ответ

2

Регулярного выражения может быть излишним здесь, но это позволяет возможные расширения:

def criterion(tag): 
    return tag.has_attr('href') and re.search('Fetch', tag.text) 

soup.findAll(criterion) 
# [<a href="/downloadsServlet?docid=ixyz" target="_blank">Fetch Report 2 </a>] 
+1

Отлично! Я отредактировал его как функцию лямбда. Благодаря ! – DrBug

+1

Используется soup.findAll (тег lambda: tag.has_attr ('href') и re.search ('Fetch', tag.text)) – DrBug

1
import re 
soup.findAll('a', text = re.compile("Fetch")) 

вы можете использовать регулярное выражение в качестве фильтра, он будет использовать re.search метод для фильтрации нашего тега.

text/string являются текстовое значение тега, text = re.compile("Fetch") означает найти тег, который текстовое значение содержит «Fetch» ​​

Document

и еще одна вещь, используйте find_all() или findAll(), findall() не является ключевым словом bs4