如何用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="{"lk_listing_id":"102447349","lk_non-ad-rollup":"0","lk_page_num":"1","lk_pos":"in_listing","lk_directory_heading":[{"086834":[{"00066200":"0"}]}],"lk_geo_tier":"dir","lk_area":"left_1","lk_relevancy":"0","lk_name":"website","lk_pos_num":"11","lk_se_id":"22ef4521-93ee-4c73-98f6-66b864a2f402_VGlueSBob21lcw_Q2FuYWRh","lk_ev":"link","event_name":"click - Website","lk_product":"none"}" 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
相关产品推荐
相关产品推荐

