2013-03-09 14 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> 

出力はhttp://www.iwashere.com/

からの出力のURLのような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>] 

のでhref属性を持つ任意の<a>タグをこれは文字列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)。あなたがBeautifulSoup 4.0.0以上を使用している場合

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

それは完全に働きました。図書館を知らない人のために。あなたは から 'bs4をインポートする必要がありますBeautifulSoup import re' – Zero

+0

私はもう一つ質問があります。 「http://www.iwashere.com/xyz ... abc.html」形式のリンクを完全に抽出することができます。しかし、リンクがローカルの場合。たとえば、[nextnext]のように言ってください。基礎となるリンクをどのように抽出できますか? HTMLコードが見られると、リンクは適切な場所にハイパーリンクされます。そのようなリンクを抽出する方法はありますか? – Zero

+0

@searcoding:スキームや二重スラッシュで始まらないものと一致する必要があります。 *で始まらない* hrefの値は相対URLです。 *:():)) ')'(これは負の値です) 'href = re.compile(r '^(?!(?:[a-zA-Z] [a-zA-Z0-9 + .-] *:スキームや二重スラッシュをテストするためのルックアヘッド、それ以外のものはマッチしません)。 –

4

:どのような値代わりに相対パスでなければなりません

soup.select('a[href^="http://www.iwashere.com/"]') 
関連する問題