2013-03-09 6 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/')) 

합니다 (예를 들어) 일치하십시오 href 속성

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

그래서 어떤 <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 가져 오기 다시 – 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 + .-] * : | //))')' 스킴이나 이중 슬래시를 테스트하기위한 look-ahead, 일치하지 않는 것은 * match). –

4

: 이러한 값 대신 상대 경로 여야 그것은 완벽하게 작동

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