2013-03-09 16 views
7

È possibile ottenere solo URL specifici?Python BeautifulSoup Estrai URL specifici

come:

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

uscita dovrebbe essere solo gli URL da http://www.iwashere.com/

come, gli URL di uscita:

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

l'ho fatto con la logica della stringa. Esiste un metodo diretto con BeautifulSoup?

risposta

13

È possibile abbinare molteplici aspetti, tra cui l'uso di un'espressione regolare per il valore di attributo:

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

che corrisponde (per l'esempio):

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

in modo che qualsiasi <a> tag con un attributo href che ha un valore che inizia con la stringa http://www.iwashere.com/.

È possibile effettuare il ciclo sui risultati e scegliere solo l'attributo 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 

Per abbinare tutti i percorsi relativi, invece, utilizzare un negativo asserzione look-ahead che verifica se il valore non non inizio con uno schema (ad esempio http: o mailto:) o una doppia barra (//hostname/path); tale valore deve essere un percorso relativo, invece:

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

Ha funzionato perfettamente. Per le persone che non sono a conoscenza delle biblioteche. È necessario 'da bs4 import BeautifulSoup import re' – Zero

+0

Ho ancora una domanda. Possiamo estrarre perfettamente i collegamenti se si trovano nel formato 'http: //www.iwashere.com/xyz ... abc.html'. Ma, se i collegamenti sono locali. Dire, come '[next, next]'. Come posso estrarre il link sottostante? Quando viene visualizzato il codice HTML, il collegamento viene linkato con una posizione corretta. Qualche modo per estrarre tali collegamenti? – Zero

+0

@searcoding: è necessario abbinare qualsiasi cosa che non inizia con uno schema o una doppia barra; qualsiasi valore 'href' che * non * inizi con quelli è un URL relativo. Usa 'href = re.compile (r '^ (?! (?: [A-zA-Z] [a-zA-Z0-9 + .-] *: | //))')' (che è un negativo look-ahead per testare uno schema o una doppia barra, tutto ciò che ha * non * corrisponde). –

Problemi correlati