2013-03-09 22 views
7

Sadece belirli URL'leri almak mümkün mü?Python BeautifulSoup Özel URL'leri ayıkla

gibi:

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

Çıktı çıktı URL'ler gibi http://www.iwashere.com/

sadece URL'ler olmalıdır:

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

Ben dize mantığı ile bunu yaptı. BeautifulSoup kullanarak herhangi bir doğrudan yöntem var mı?

cevap

13

Sen özellik değeri için normal bir ifade kullanarak da dahil olmak üzere birçok yöne eşleşebilir:

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

(sizin gibi) eşleşir: Bir href özniteliği ile

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

yüzden herhangi <a> etiketi Bu http://www.iwashere.com/ dizesiyle başlayan bir değere sahip.

yapabilirsiniz sonuçları üzerinde döngü ve sadece href niteliğini seçmemde:

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

yerine tüm göreli yolları eşleştirmek için değer değil başlangıç ​​ile yaparsa testleri negatif ileriye bakma belirtilme kullanmak bir şema (ör. http: veya mailto:) veya çift eğik çizgi (//hostname/path); Eğer BeautifulSoup 4.0.0 veya daha kullanıyorsanız

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

. Kütüphanelerin farkında olmayan insanlar için. Bs4 ithalattan ''e ihtiyacınız var BeautifulSoup import re' – Zero

+0

Bir sorum daha var. Http: //www.iwashere.com/xyz ... abc.html biçimindeyse bağlantıları mükemmel bir şekilde ayıklayabiliriz. Ancak, bağlantılar yerel ise. Diyelim ki, [next, next] 'gibi. Temel bağlantıyı nasıl çıkarabilirim? HTML kodu görüldüğünde, bağlantı uygun konumla hiper bağlanır. Bu tür bağlantıları çıkarmanın herhangi bir yolu var mı? – Zero

+0

@searcoding: Bir şema veya çift eğik çizgi ile başlamayan her şeye uymanız gerekir; Bunun yerine * başlamaz * olan herhangi bir “href” değeri bunun yerine göreceli bir URL'dir. Kullanımı href = re.compile (r '^ (?! (?: [A-zA-Z] [a-zA-Z0-9 + .-] *: | //))') '(bu bir negatif Bir şema veya çift eğik çizgiyi test etmek için ileriye bakmak, bunlara sahip olan her şey * eşleşmez *. –

4

: Bu tür bir değer yerine göreli bir yol olmalıdır O mükemmel çalıştı

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