我正在组装一个网络爬虫用于练习和学习,并发现了一些问题。我最初的思考过程是...
出现了一个我没有意识到的问题。有些路径引用了网站上的其他资源。 (包括图片)。当前的网址是“患者访问者/提前指令/”,资源“服务/家庭医学”实际上指的是columbiabasinhospital.org/services/family-medicine“。我设置它的方式会产生错误的网址(将鼠标悬停在资源上会显示完整链接,我想知道是否有办法使用 BeautifulSoup 检索该链接?谢谢!
from urllib.parse import urljoin
new_url = urljoin(current_url, href)
例如
urljoin('http://localhost/foo/bar/', '/baz/')
# Outputs 'http://localhost/baz/'
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
elem.href
得到的结果。事实证明,有些细微差别是
urllib.parse.urljoin
无法处理的:
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。完整的规范非常复杂。我没有读过它,但我发现了一些实现它的库:
我测试了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'