【问题标题】:make_links_absolute() results in broken absolute URLsmake_links_absolute() 导致绝对 URL 损坏
【发布时间】:2020-09-23 11:18:07
【问题描述】:

我需要将 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

如您所见,最终 URL 中间有双倍的o-gorode,肯定会产生 404 错误。

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'

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

有什么建议可以解决这个问题吗?我尝试了furl,但它执行相同的连接。

【问题讨论】:

    标签: python relative-url pyquery


    【解决方案1】:

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

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

    指示浏览器使用它来解析任何相关链接。 &lt;base&gt; 元素是可选的,但如果存在,则必须使用它而不是页面的实际 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/

    这似乎是正确的。

    【讨论】:

    • 你是绝对正确的——线索就在那个基本属性中。非常感谢!
    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2018-03-07
    相关资源
    最近更新 更多