2013-03-09 21 views
7

Czy można uzyskać tylko określone adresy URL?Python BeautifulSoup Uzyskaj szczegółowe adresy URL:

odczuwalna:

<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> 

Wyjście powinno być tylko adresy od http://www.iwashere.com/

podobnego URL wyjściowych:

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

Zrobiłem to przez logikę strun. Czy istnieje jakaś bezpośrednia metoda wykorzystująca BeautifulSoup?

Odpowiedz

13

można dopasować wiele aspektów, w tym za pomocą wyrażenia regularnego dla wartości atrybutu:

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

który pasuje (dla przykładu):

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

więc każdy <a> tag z atrybutem href ma wartość zaczynającą się od ciągu http://www.iwashere.com/.

Można pętli nad wynikami i wyłowić tylko atrybut 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 

Aby dopasować wszystkie ścieżki względne zamiast korzystania negatywny antycypowanego twierdzenie, że sprawdza, czy wartość ma nie początek z schemat (na przykład http: lub mailto:) lub podwójny ukośnik (//hostname/path); Każda taka wartość musi być względna ścieżka zamiast:

soup.find_all('a', href=re.compile(r'^(?!(?:[a-zA-Z][a-zA-Z0-9+.-]*:|//))')) 
+1

To działało idealnie. Dla osób, które nie znają bibliotek. Musisz 'od importu bs4 BeautifulSoup import re' – Zero

+0

Mam jeszcze jedno pytanie. Możemy idealnie wyodrębnić linki, jeśli są one w formacie "http: //www.iwashere.com/xyz ... abc.html". Ale jeśli linki są lokalne. Powiedz, jak '[next, ]'. Jak mogę wyodrębnić podstawowy link? Kiedy kod HTML jest widoczny, link jest połączony z odpowiednią lokalizacją. Jakikolwiek sposób na wyodrębnienie takich linków? – Zero

+0

@searcoding: Musisz dopasować wszystko, co nie zaczyna się od schematu lub podwójnego ukośnika; dowolna wartość 'href', która nie * nie * zaczyna się od tych, jest względnym adresem URL. Użyj 'href = re.compile (r '^ (?! (?: [A-zA-Z] [a-zA-Z0-9 + .-] *: | //))") (to jest negatywne patrzeć z wyprzedzeniem, aby przetestować schemat lub podwójne ukośnik, wszystko, co ma te * nie * pasuje). –