You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup抓取含跳转链接的HTML元素获取目标URL?

问题描述

需要抓取目标HTML元素中的真实URL(示例为https://www.sunshinetinyhomes.com),但现有BeautifulSoup代码返回javascript:void(0)或None。

用户原代码:

page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
for list in lists:
    try:
        website = list.find('a', class_="mlr__item__cta")['href']
    except:
        website=''
    print(website)

用户尝试的另一代码(返回None):

website = list.find('a', attrs={'href': re.compile("^https://")})

目标HTML结构:

<a href="/gourl/860d9e703fe038a35b2ee780cec2f548976d60aa?redirect=http%3A%2F%2Fwww.sunshinetinyhomes.com%2F" class="mlr__item__cta" rel="nofollow" title="Sunshine Tiny Homes Ltd - Business Website" data-analytics="{&quot;lk_listing_id&quot;:&quot;102447349&quot;,&quot;lk_non-ad-rollup&quot;:&quot;0&quot;,&quot;lk_page_num&quot;:&quot;1&quot;,&quot;lk_pos&quot;:&quot;in_listing&quot;,&quot;lk_directory_heading&quot;:[{&quot;086834&quot;:[{&quot;00066200&quot;:&quot;0&quot;}]}],&quot;lk_geo_tier&quot;:&quot;dir&quot;,&quot;lk_area&quot;:&quot;left_1&quot;,&quot;lk_relevancy&quot;:&quot;0&quot;,&quot;lk_name&quot;:&quot;website&quot;,&quot;lk_pos_num&quot;:&quot;11&quot;,&quot;lk_se_id&quot;:&quot;22ef4521-93ee-4c73-98f6-66b864a2f402_VGlueSBob21lcw_Q2FuYWRh&quot;,&quot;lk_ev&quot;:&quot;link&quot;,&quot;event_name&quot;:&quot;click - Website&quot;,&quot;lk_product&quot;:&quot;none&quot;}" target="_blank">
<span class="ypicon ypicon-web mlr__icon"></span><span class="serpMessage">Website</span>
</a>
解决方案

真实URL被编码在href属性的redirect查询参数中,需要提取并解码:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs, unquote

page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

# 注意:不要用list作为变量名(内置函数),改用listing
for listing in lists:
    try:
        link = listing.find('a', class_="mlr__item__cta")['href']
        # 解析URL,提取查询参数
        parsed_link = urlparse(link)
        query_dict = parse_qs(parsed_link.query)
        # 提取redirect参数并解码
        real_url = unquote(query_dict['redirect'][0])
        print(real_url)
    except (KeyError, TypeError):
        # 处理无redirect参数或元素不存在的情况
        print('')

代码说明

  • urlparse:拆分URL结构,分离出查询字符串部分
  • parse_qs:将查询字符串解析为字典,redirect对应的值是列表,取第一个元素即可
  • unquote:对URL编码的字符串进行解码,还原出原始目标URL
  • 异常处理:指定捕获KeyError(无redirect参数)和TypeError(元素不存在),避免裸except隐藏其他问题

内容的提问来源于stack exchange,提问作者Dalia Tawfeek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:54:24