【问题标题】:How to get a full website path from a relative website path using BeautifulSoup如何使用 BeautifulSoup 从相对网站路径获取完整的网站路径
【发布时间】:2016-06-28 14:34:04
【问题描述】:

我正在实现一个网络爬虫,我正在尝试解析 HTML 中的链接。我可以跟踪完整的网站路径,但有些相对路径会有点奇怪。

我可以遵循完整路径,即http://foo.com/bar/baz,并且我能够通过使用以下函数找到遵循相对路径的方法,即/qux

def baseUrl(url):
    u = urlparse.urlparse(url)
    return "{}://{}{}/".format(u.scheme, u.netloc, '/'.join(u.path.split('/')[:-1]))

def fullUrl(url, parent):
    u = urlparse.urlparse(url)
    if u.scheme:
        return url.split("/#")[0]
    else:
        return "{}{}".format(baseUrl(parent), url).split("/#")[0]

但有时,网站 url 是 http://foo.com/bar/baz,而在 HTML 中,有类似 <a href='/bar/qux' 的东西。目标网址应该是http://foo.com/bar/qux,但我的代码输出的是http://foo.com/bar//bar/qux

有没有人知道一种通用的方法来确定两个 URL 之间的哪些部分匹配,以便从相对路径中找出完整路径是什么?

【问题讨论】:

    标签: python html beautifulsoup python-requests


    【解决方案1】:

    我一直在做并且到目前为止对我有用的是使用当前页面 URL 调用 urljoin()

    >>> from urlparse import urljoin
    >>> urljoin("http://foo.com/bar/baz", "/bar/qux")
    'http://foo.com/bar/qux'
    

    【讨论】:

    • 这正是我所需要的。谢谢!
    • 我还有另一个(相关)问题。有时,当我在爬网时,我访问的 URL 类似于 http://foo.com/bar,它会重定向到 http://foo.com/bar/。由于重定向,它会寻找不正确的相对路径。你知道我怎么能解决这个问题吗?再次感谢您!
    • @Brian 快速而肮脏的解决方法是使用url.rstrip("/"),但要确保它不会破坏其他用例。谢谢。
    • @alexce,我的问题实际上是相反的。我爬到的网址是http://foo.com/bar,并且(在浏览器中)它重定向到http://foo.com/bar/(因为它是一个目录)。因此,当我尝试爬到/baz 时,它转到http://foo.com/baz 而不是http://foo.com/bar/baz
    • @Brian hm,但是如果您有 /baz 相对 URL,那么连接为您提供 http://foo.com/baz 实际上是正确的,不是吗? urljoin("http://foo.com/bar/", "/baz")urljoin("http://foo.com/bar", "/baz") 都会产生 http://foo.com/baz。对不起,如果我误解了这个问题。
    猜你喜欢
    • 2011-12-11
    • 2019-08-10
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多