2016-08-16 2 views
0

주어진 웹 페이지 내의 모든 링크를 찾아야하는 웹 크롤링 프로젝트를 진행 중입니다. 지금까지 urllib.parseurljoin을 사용하고있었습니다. 하지만 이제 일부 링크가 urljoin 함수를 사용하여 올바르게 결합되지 않은 것으로 나타났습니다.파이썬을 사용하여 href에서 전체 URL 추출

예 : <a> 태그는 <a href="a.xml?value=basketball">A</a>과 같을 수 있습니다. 그러나 전체 주소는 http://www.example.org/main/test/a.xml?value=basketball 일 수 있지만 urljoin 함수는 잘못된 결과 (예 : http://www.example.com/a.xml?value=basketball)를 제공합니다. 내가 사용하고

코드 :

parentUrl = urlQueue.get() 

html = get_page_source(parentUrl) 

bSoup = BeautifulSoup(html, 'html.parser') 
aTags = bSoup.find_all('a', href=True) 

for aTag in aTags: 
    childUrl = aTag.get('href') 

    # just to check if the url is complete or not(for .com only) 
    if '.com' not in childUrl: 
     # this urljoin is giving invalid resultsas mentioned above 
     childUrl = urljoin(parentUrl, childUrl) 

내가 올바르게 이러한 경우를 포함하여 두 개의 URL에 가입 할 수있는 방법이 있습니까?

+0

빌드 할 최소한의 작업 코드를 제공하면 도움을받을 가능성이 더 큽니다. – handle

+0

당신이 뭔가 다른 것을 필요로하면 말해줘.하지만 내 주요 관심사는 때로는 전체 경로를 포함하지 않을 수 있습니다 href 속성을 사용하여 절대 링크 주소를 만드는 것입니다. –

+0

메모를 삭제하십시오. 그것은 브라우저 기능입니다. –

답변

0

이 작업을 수행하기위한 몇 가지 조정이 있습니다. 귀하의 경우에는 뒤에 슬래시가있는 기본 URI를 전달하십시오. 이 작업을 수행해야합니다 모든 BTW docs of urlparse

>>> import urlparse 
>>> urlparse.urljoin('http://www.example.org/main/test','a.xml?value=basketball') 
'http://www.example.org/main/a.xml?value=basketball' 
>>> urlparse.urljoin('http://www.example.org/main/test/','a.xml?value=basketball') 
'http://www.example.org/main/test/a.xml?value=basketball' 

기록한다 : 이것은 별도의 함수로 URL을 구축하기위한 코드를 반영 할 수있는 완벽한 유스 케이스입니다. 그런 다음 몇 가지 단위 테스트를 작성하여 예상대로 작동하는지 확인하고 가장자리 경우에도 작동합니다. 그런 다음 웹 크롤러 코드에서 사용하십시오.

+0

이 코드는 Python 2.7에서 작동하지만 언급 된 OP로 urllib.parse를 사용하면 Python 3.5에 적용될 수 있습니다. –

+0

고맙습니다. 그것은 내가 시도한 몇 가지 경우에 효과가있는 것으로 보인다. 이 대답을 받아들이 기 전에 그것을 완전히 시험해 보겠습니다. –

관련 문제