2013-03-09 2 views
7

Возможно ли получить только определенные URL-адреса?Python BeautifulSoup Извлечь определенные 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?

ответ

13

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

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+.-]*:|//))')) 
+1

Он работал отлично. Для людей, которые не знают о библиотеках. Вам нужно 'from bs4 import BeautifulSoup import re' – Zero

+0

У меня есть еще один вопрос. Мы можем прекрасно извлекать ссылки, если они находятся в формате 'http: //www.iwashere.com/xyz ... abc.html'. Но, если ссылки локальны. Скажем, например '[next, next]'. Как я могу извлечь базовую ссылку? Когда отображается HTML-код, ссылка гиперссылка с правильным местоположением. Любой способ извлечь такие ссылки? – Zero

+0

@searcoding: вам нужно будет сопоставить все, что не начинается с схемы или двойной косой черты; любое значение 'href', которое * не * начинает с них, является относительным URL. Используйте 'href = re.compile (r '^ (?! (?: [A-zA-Z] [a-zA-Z0-9 + .-] *: | //))')' (это отрицательный чтобы проверить схему или двойную косую черту, все, что есть, не соответствует *. –