make_links_absolute()会导致断开的绝对URL

2024-07-04 06:03:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将相对URL从HTML页面转换为绝对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

正如你所看到的,在最终URL的中间有一个双倍的^ {CD2>},肯定会产生404个错误。

Google Chrome is good in URL conversion

pyquery在内部使用标准urllib.parse模块中的urljoin,有点像这样:

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'

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

如何解决这个问题有什么建议吗?我尝试了^{},但它的连接方式相同


Tags: importinfohttpurlmake链接page页面
1条回答
网友
1楼 · 发布于 2024-07-04 06:03:04

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

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

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

为了像浏览器那样操作,请提取base 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/

这似乎是正确的

相关问题 更多 >

    热门问题