Web Scraping技术求助:无法将抓取的Href与Stub拼接至full_url数组
解决URL拼接失败的问题
我帮你梳理下代码里的问题,这几个地方改了应该就能正常拼接URL了:
代码里的核心错误点
- 循环里的语法错误:
full_url.item.find('a').get('href')这行写法不对,应该直接用item.find('a').get('href')来获取a标签的href属性,还要把它存成变量方便后续使用。 urljoin的参数用错了:你写的是urljoin('stub', 'event_url'),这两个都是字符串字面量,应该用实际定义的stub变量和刚获取到的href值。- 缺少
headers定义:requests.get(url, headers=headers)里的headers没初始化,请求可能会被网站拦截,得补个基础的headers。 - 可能
find_all(id='ctl5')返回的是单个元素?如果页面里id为ctl5的元素只有一个,用find(id='ctl5')更合适,避免循环处理单个元素的尴尬。
修正后的完整代码
import pandas as pd import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 补全headers,模拟浏览器请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } url = 'http://www.owgr.com/events?pageNo=1&pageSize=400&tour=Eur&year=2019' stub = 'http://www.owgr.com' page = requests.get(url, headers=headers) soup = BeautifulSoup(page.text, 'html.parser') full_url = [] # 如果ctl5是单个元素,用find代替find_all full_url_elem = soup.find(id='ctl5') # 先判断元素是否存在,避免报错 if full_url_elem: # 找到该元素下所有的a标签(如果是多个的话) a_tags = full_url_elem.find_all('a') for a in a_tags: href = a.get('href') # 检查href是否存在,再拼接 if href: complete_url = urljoin(stub, href) full_url.append(complete_url) # 打印结果看看 print(full_url)
额外说明
urljoin会自动处理相对路径和绝对路径:如果href已经是完整URL,它会直接返回;如果是相对路径,会自动和stub拼接成完整URL,比手动拼接更靠谱。- 加了元素存在性检查,避免因为页面结构变化找不到元素导致代码崩溃。
内容的提问来源于stack exchange,提问作者rug
相关产品推荐
相关产品推荐

