使用Python requests与XPath提取链接结果与浏览器显示不一致问题求助
问题原因
- 页面内
a标签的href属性本身存储的是相对路径,没有包含域名、上级路径前缀。浏览器访问页面时会自动将相对路径和当前页面的基准URL拼接为完整可访问路径,lxml直接提取属性值不会自动做这一步拼接,因此只能拿到后半段路径。 - 原始属性值里的空格没有做URL编码,浏览器渲染链接时会自动对URL内的特殊字符做百分号编码,将空格转换为
%20,这也是爬取结果和浏览器显示有差异的原因之一。
解决方法
使用Python标准库urllib.parse的urljoin方法拼接绝对路径,同时可以用quote方法做标准化URL编码,参考代码如下:
import requests from lxml import html from urllib.parse import urljoin, quote # 定义当前爬取页面的基准URL base_url = "http://kenyalaw.org:8181/exist/kenyalex/actview.xql?actid=CAP.%2016" r = requests.get(base_url) data = html.fromstring(r.content) # 提取相对路径 relative_href = data.xpath("//div[@class='subleg']/a/@href")[0] # 拼接生成绝对路径 full_url = urljoin(base_url, relative_href) # 标准化编码,仅转义空格等特殊字符,保留URL必要符号 full_url_encoded = quote(full_url, safe=':/?=&') print(full_url_encoded)
运行上述代码即可输出和浏览器显示一致的完整链接。
内容的提问来源于stack exchange,提问作者Ciric Aleksandar
相关产品推荐
相关产品推荐

