links = re.findall('href="(http(s?)://[^"]+)"',page)

Mam ten regularny wyrażenie, aby znaleźć wszystkie linki na stronie internetowej, otrzymuję ten wynik:

('http://asecuritysite.com', '')
('https://www.sans.org/webcasts/archive/2013', 's')

Kiedy chcę, to tylko to:

http://asecuritysite.com
https://www.sans.org/webcasts/archive/2013

Jeśli wyeliminę "( po hrefie daje mi mnóstwo błędów, czy ktoś może wyjaśnić dlaczego?

0
user2988983 27 listopad 2013, 20:53

3 odpowiedzi

Najlepsza odpowiedź

Spróbuj pozbyć się drugiej grupy ((s?) w oryginalnym wzorze):

links = re.findall('href="(https?:\/\/[^"]+)"',page)
1
p.s.w.g 27 listopad 2013, 16:54

Jeśli używasz więcej niż 1 grupa przechwytywania, re.findall Lista zwrotów Ktoczków zamiast listy ciągów. Spróbuj posłuchać (tylko przy użyciu pojedynczej grupy):

>>> import re
>>> page = '''
...     <a href="http://asecuritysite.com">here</a>
...     <a href="https://www.sans.org/webcasts/archive/2013">there</a>
...     '''
>>> re.findall(r'href="(https?:\/\/[^"]+)"',page)
['http://asecuritysite.com', 'https://www.sans.org/webcasts/archive/2013']

Według Dokumentacja re.findall:

Jeśli w wzorze jest obecna jedna lub więcej grup, zwróć listę grupy; Będzie to lista Ktorek , jeśli wzór ma więcej niż jeden grupa.

2
falsetru 27 listopad 2013, 17:01

To, co robisz źle, próbuje analizować HTML z Regexa. I że panie jest grzechem.

Patrz tutaj, aby okropności parsowania html html

Alternatywą jest użycie czegoś takiego jak LXML, aby przeanalizować stronę i wyodrębnić linki coś takiego

urls = html.xpath('//a/@href')
1
Community 23 maj 2017, 12:12