Python爬虫:如何为相对URL添加前缀修复链接报错问题
解决Python爬虫中相对URL的问题
嘿,这个问题我之前爬站时也踩过坑!urllib.request.urlopen() 只认完整的绝对URL,你拿到的是相对路径,它根本不知道该向哪个域名发请求,所以才会抛出unknown url type的错误。
两种靠谱的解决思路:
1. 手动拼接基础URL
先确定目标网站的基础路径,你爬的站点根路径是https://saturn.etat.lu/tapes/,直接把这个前缀和相对路径拼在一起就行:
base_url = "https://saturn.etat.lu/tapes/" # 比如你的相对路径是 'tapes_fr_nfo_lap.jsp?pdt=1838&lmz=0' full_url = base_url + url
2. 用urllib.parse.urljoin自动拼接(更推荐)
这个方法更智能,能自动处理各种复杂的相对路径(比如带../的上级路径、根目录开头的/路径),不用自己手动拼接容易出错。
修改后的完整代码:
import urllib.request from urllib.parse import urljoin # 导入urljoin工具 from bs4 import BeautifulSoup import re import sqlite3 def make_soup(url): thepage = urllib.request.urlopen(url) soupdata = BeautifulSoup(thepage, "html.parser") return soupdata # 定义站点基础URL base_url = "https://saturn.etat.lu/tapes/" soup = make_soup("https://saturn.etat.lu/tapes/tapes_fr_lst_pdt.jsp?sel=_") allrecords = soup.findAll('tr') recordsLength = len(allrecords) for index in range(3, recordsLength): record = allrecords[index].find_all('a') agri = [record[1].get('href')] for url in agri: # 核心:把相对路径转为绝对URL full_url = urljoin(base_url, url) agripage = urllib.request.urlopen(full_url) soup1 = BeautifulSoup(agripage, "html.parser") # 这里可以继续处理soup1中的页面数据
为什么更推荐urljoin?
比如如果页面里的相对路径是../other/page.jsp,手动拼接会生成错误的地址,但urljoin会自动根据基础URL调整路径,生成正确的绝对地址,兼容性和容错性更强。
内容的提问来源于stack exchange,提问作者Gagan Deep Singh
相关产品推荐
相关产品推荐

