使用Python从href中提取完整的URL

时间:2016-08-16 07:43:14

标签: python web-crawler urllib

我正在进行网络抓取项目,我需要找到给定网页中的所有链接。直到现在我在urljoin中使用urllib.parse。但是现在我发现使用urljoin函数没有正确连接某些链接。

例如<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)

我有没有办法正确加入两个网址,包括这些情况?

1 个答案:

答案 0 :(得分:1)

只需进行一些调整即可实现此功能。在你的情况下传递带有尾部斜杠的基URI。完成此任务所需的一切都写在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'
BTW:这是一个完美的用例,可以将构建URL的代码分解为单独的函数。然后编写一些单元测试来验证它是否按预期工作,甚至可以处理边缘情况。然后在您的网络抓取工具代码中使用它。