Python + BeautifulSoup:如何从 href 属性获取完整链接?

问题描述 投票:0回答:3

我正在组装一个网络爬虫用于练习和学习,并发现了一些问题。我最初的思考过程是...

  1. 在给定页面上,查找所有 href 属性。如果 href 值是有效链接,请转到此新链接并继续
  2. 如果 href 值是路径(例如“/患者/患者门户”或“/服务/财务援助”),我会将其附加到我所在的当前 URL 的末尾并再次继续。

出现了一个我没有意识到的问题。有些路径引用了网站上的其他资源。 (包括图片)。当前的网址是“患者访问者/提前指令/”,资源“服务/家庭医学”实际上指的是columbiabasinhospital.org/services/family-medicine“。我设置它的方式会产生错误的网址(将鼠标悬停在资源上会显示完整链接,我想知道是否有办法使用 BeautifulSoup 检索该链接?谢谢!

enter image description here

python beautifulsoup web-crawler
3个回答
2
投票
使用

urllib.parse.urljoin

 从基本 URL 和另一个可能相对的 URL/路径返回正确的 URL

from urllib.parse import urljoin new_url = urljoin(current_url, href)
例如

urljoin('http://localhost/foo/bar/', '/baz/') # Outputs 'http://localhost/baz/'
    

0
投票
您可以使用

from urllib.parse import urljoin

。但是,你也可以自己写!

假设当前URL为:

http://example.com/path1/path2


href 属性的值类似于: /x

 时,您必须将其添加到根路径,即 
http://example.com/x

但是,当

href 属性的值类似于: ./x

x
 时,您需要将其添加到整个地址,即 
http://example.com/path1/x

    


0
投票
我有一个类似的任务,我想像浏览器一样将 href 属性转换为完整的 URL。或者具体来说,模拟我在浏览器中使用

elem.href

 得到的结果。事实证明,有些细微差别是 
urllib.parse.urljoin
 无法处理的:

    百分比编码:浏览器对 href 中的特殊字符和非 ASCII 字符进行编码:
  • href="/{}"
     -> 
    https://example.com/%7B%7D
      调用
    • urllib.parse.quote
       修复了上面的示例,但会得到这个错误: 
      href="/a?b=1"
       -> 
      https://example.com/a?b=1
       - 在 Python 中,你可能必须先拆分 URL,然后分别引用每个部分。
  • 修剪空间:
  • href=" /test "
     -> 
    https://example.com/test
这些是在我的网络爬行数据集中发现的导致某些问题的案例。我怀疑可能还有更多我没有注意到的边缘情况。

看起来

WHATWG URL Standard 定义(或至少描述)浏览器应如何将这些 href 解析为 URL。完整的规范非常复杂。我没有读过它,但我发现了一些实现它的库:

  • https://github.com/sethmlarson/whatwg-url
  • https://github.com/miute/urlstd
我测试了whatwg-url,到目前为止效果很好:

>>> whatwg_url.parse_url('/{}', 'https://example.com/').href 'https://example.com/%7B%7D' >>> whatwg_url.parse_url(' /test ', 'https://example.com/').href 'https://example.com/test' >>> whatwg_url.parse_url('/a?b=1', 'https://example.com/').href 'https://example.com/a?b=1'
    
© www.soinside.com 2019 - 2024. All rights reserved.