使用XPath解析未闭合标签HTML时Python代码返回空列表的问题排查
问题解决:Python XPath解析学科列表返回空的修复方案
核心问题排查
- 语法低级错误:代码里
category==content.xpath(...)用了双等号(比较运算符),应该改成单等号(赋值运算符),否则category会变成布尔值而非列表。 - XPath匹配失效:直接用
text()="Area of Study"匹配h3标签容易失败,因为网页中该标签的文本可能包含空格、换行或被其他节点嵌套,导致精确匹配不生效。 - 请求头缺失:目标网站可能会拦截无标识的爬虫请求,返回的内容和预期不一致,导致节点无法定位。
- 未闭合标签影响:虽然lxml的
fromstring能容错未闭合<li>,但解析后的节点结构可能和预期有偏差,需要调整XPath适配。
修正后的代码
import requests from lxml import html # 添加请求头模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } url = r'https://universitystudy.ca/search-programs/?k=&program_level_merged=&program_language=ENGLISH' # 发送请求并解析内容 resp = requests.get(url, headers=headers) content = html.fromstring(resp.content) # 调整XPath,用normalize-space处理文本空格,确保匹配到目标h3 categories = content.xpath('//h3[normalize-space(text())="Area of Study"]/following-sibling::ul//li/a/text()') # 输出结果 for cat in categories: print(cat.strip())
预期获取的中文列表
- 工商管理通用方向(520)
- 计算机科学(289)
- 数学通用方向(279)
- 心理学通用方向(277)
- 经济学通用方向(250)
- 生物学/生物科学通用方向(249)
- 地理学(241)
- 英语语言文学通用方向(240)
- 化学通用方向(220)
- 政治学与政府学通用方向(211)
- 历史学通用方向(200)
内容的提问来源于stack exchange,提问作者chariots of fire
相关产品推荐
相关产品推荐

