gpt4 book ai didi

python - make_links_absolute() 导致绝对 URL 损坏

转载 作者:行者123 更新时间:2023-12-04 09:44:13 24 4
gpt4 key购买 nike

我需要将 HTML 页面中的相对 URL 转换为绝对 URL。我正在使用 pyquery 进行解析。

例如,此页面 http://govp.info/o-gorode/gorozhane在源代码中有相对 URL,例如

<a href="o-gorode/gorozhane?page=2">2</a>

(这是页面底部的分页链接)。我正在尝试使用 make_links_absolute() :
import requests
from pyquery import PyQuery as pq

page_url = 'http://govp.info/o-gorode/gorozhane'
resp = requests.get(page_url)
page = pq(resp.text)

page.make_links_absolute(page_url)

但这似乎打破了相对链接:
print(page.find('a[href*="?page=2"]').attr['href'])

# prints http://govp.info/o-gorode/o-gorode/gorozhane?page=2
# expected value http://govp.info/o-gorode/gorozhane?page=2

如您所见, o-gorode 翻了一番在最终 URL 的中间肯定会产生 404 错误。

Google Chrome is good in URL conversion

pyquery 内部使用 urljoin来自标准 urllib.parse模块,有点像这样:
from urllib.parse import urljoin
urljoin('http://example.com/one/', 'two')

# -> 'http://example.com/one/two'

没关系,但是有很多网站都有,嗯,具有完整路径的不寻常的相对链接。

在这种情况下 urljoin会给我们一个无效的绝对链接:
urljoin('http://govp.info/o-gorode/gorozhane', 'o-gorode/gorozhane?page=2')

# -> 'http://govp.info/o-gorode/o-gorode/gorozhane?page=2'

我相信这样的相对链接不是很有效,但谷歌浏览器处理它们没有问题;所以我想这在网络上是很正常的。

有什么建议可以解决这个问题吗?我试过 furl 但它的加入也是一样的。

最佳答案

在这种特殊情况下,相关页面包含

<base href="http://govp.info/"/>

它指示浏览器使用它来解析任何相关链接。 <base>元素是可选的,但如果它存在,则必须使用它而不是页面的实际 URL。

为了像浏览器那样做,提取基本 href 并在 make_links_absolute() 中使用它.
import requests
from pyquery import PyQuery as pq

page_url = 'http://govp.info/o-gorode/gorozhane'
resp = requests.get(page_url)
page = pq(resp.text)

base = page.find('base').attr['href']
if base is None:
base = page_url # the page's own URL is the fallback

page.make_links_absolute(base)

for a in page.find('a'):
if 'href' in a.attrib and 'govp.info' in a.attrib['href']:
print(a.attrib['href'])

打印

http://govp.info/assets/images/map.png
http://govp.info/podpiska.html
http://govp.info/
http://govp.info/#order
...
http://govp.info/o-gorode/gorozhane
http://govp.info/o-gorode/gorozhane?page=2
http://govp.info/o-gorode/gorozhane?page=3
http://govp.info/o-gorode/gorozhane?page=4
http://govp.info/o-gorode/gorozhane?page=5
http://govp.info/o-gorode/gorozhane?page=6
http://govp.info/o-gorode/gorozhane?page=2
http://govp.info/o-gorode/gorozhane?page=17
http://govp.info/bannerclick/264
...
http://doska.govp.info/cat-biznes-uslugi/
http://doska.govp.info/cat-transport/legkovye-avtomobili/
http://doska.govp.info/
http://govp.info/

这似乎是正确的。

关于python - make_links_absolute() 导致绝对 URL 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62195192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com