Python BeautifulSoup Извлечение определенных URL-адресов

Можно ли получить только определенные URL-адреса?

Нравиться:

<a href="http://www.iwashere.com/washere.html">next</a>
<span class="class">...</span>
<a href="http://www.heelo.com/hello.html">next</a>
<span class="class">...</span>
<a href="http://www.iwashere.com/wasnot.html">next</a>
<span class="class">...</span>

В выводе должны быть только URL-адреса из http://www.iwashere.com/

например, выходные URL:

http://www.iwashere.com/washere.html
http://www.iwashere.com/wasnot.html

Я сделал это по строковой логике. Есть ли прямой метод с использованием BeautifulSoup?


person Zero    schedule 09.03.2013    source источник


Ответы (3)


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

import re
soup.find_all('a', href=re.compile('http://www\.iwashere\.com/'))

что соответствует (для вашего примера):

[<a href="http://www.iwashere.com/washere.html">next</a>, <a href="http://www.iwashere.com/wasnot.html">next</a>]

поэтому любой тег <a> с атрибутом href, значение которого начинается со строки http://www.iwashere.com/.

Вы можете просмотреть результаты и выбрать только атрибут href:

>>> for elem in soup.find_all('a', href=re.compile('http://www\.iwashere\.com/')):
...     print elem['href']
... 
http://www.iwashere.com/washere.html
http://www.iwashere.com/wasnot.html

Вместо этого, чтобы сопоставить все относительные пути, используйте отрицательное утверждение упреждающего просмотра, которое проверяет, начинается ли значение не со схемы (например, http: или mailto:) или с двойной косой черты (//hostname/path); вместо этого любое такое значение должно быть относительным путем:

soup.find_all('a', href=re.compile(r'^(?!(?:[a-zA-Z][a-zA-Z0-9+.-]*:|//))'))
person Martijn Pieters    schedule 09.03.2013
comment
Это сработало отлично. Для тех, кто не знаком с библиотеками. Вам нужно from bs4 import BeautifulSoup import re - person Zero; 09.03.2013
comment
У меня есть еще один вопрос. Мы можем отлично извлекать ссылки, если они в формате http://www.iwashere.com/xyz...abc.html. Но, если ссылки локальные. Скажем, как [<a href="washere.html">next</a>, <a href="wwasnot.html">next</a>]. Как я могу извлечь базовую ссылку? Когда виден HTML-код, ссылка становится гиперссылкой с правильным местоположением. Любой способ извлечь такие ссылки? - person Zero; 10.03.2013
comment
@searcoding: вам нужно сопоставить все, что не начинается со схемы или двойной косой черты; любое значение href, которое не начинается с них, является относительным URL-адресом. Используйте href=re.compile(r'^(?!(?:[a-zA-Z][a-zA-Z0-9+.-]*:|//))') (это отрицательный предварительный просмотр для проверки схемы или двойной косой черты, все, что имеет это, не совпадает). - person Martijn Pieters; 10.03.2013

Если вы используете BeautifulSoup 4.0.0 или более позднюю версию:

soup.select('a[href^="http://www.iwashere.com/"]')
person Droogans    schedule 10.03.2013

Вы можете решить эту проблему с помощью частичного сопоставления в gazpacho:

Вход:

html = """\
<a href="http://www.iwashere.com/washere.html">next</a>
<span class="class">...</span>
<a href="http://www.heelo.com/hello.html">next</a>
<span class="class">...</span>
<a href="http://www.iwashere.com/wasnot.html">next</a>
<span class="class">...</span>
"""

Код:

from gazpacho import Soup

soup = Soup(html)
links = soup.find('a', {'href': "http://www.iwashere.com/"}, partial=True)
[link.attrs['href'] for link in links]

Что выведет:

# ['http://www.iwashere.com/washere.html', 'http://www.iwashere.com/wasnot.html']
person emehex    schedule 09.10.2020