为何我的XPath解析器仅抓取表格中少量元素?
问题原因及解决办法
核心问题1:代码只检查了前10行
你的代码里parser.xpath('//tbody/tr')[:10]是先获取匹配行后截取前10行再筛选,相当于只在前10行里找符合条件的代理,而非从全表筛选后取10个,这是结果数量远少于手动统计的直接原因。
核心问题2:tbody标签可能不存在于原始HTML中
很多现代网站的<tbody>标签是浏览器渲染时自动添加的,服务器返回的原始HTML里并没有这个标签。用//tbody/tr查找,实际只能找到极少行,这也是导致总行数获取不足的关键。
修正后的代码
import requests from lxml.html import fromstring def get_proxies(): url = 'https://free-proxy-list.net/' response = requests.get(url) parser = fromstring(response.text) proxies = set() # 直接定位目标表格的行,跳过表头行 for row in parser.xpath('//table[@id="proxylisttable"]/tr[position()>1]'): # 精确匹配匿名类型和HTTPS支持状态 is_elite = row.xpath('.//td[5]/text()')[0].strip() == 'elite proxy' supports_https = row.xpath('.//td[7]/text()')[0].strip() == 'yes' if is_elite and supports_https: ip = row.xpath('.//td[1]/text()')[0].strip() port = row.xpath('.//td[2]/text()')[0].strip() proxies.add(f"{ip}:{port}") # 收集够10个后停止遍历 if len(proxies) >= 10: break return proxies proxies = get_proxies() print(proxies)
关键修改点
- 用
//table[@id="proxylisttable"]/tr[position()>1]定位表格行,跳过表头,避免依赖浏览器自动生成的tbody标签 - 遍历全表筛选符合条件的条目,收集到10个后停止,而非先取前10行再筛选
- 改用精确文本匹配代替
contains,避免因文本空格或额外字符导致的误判
内容的提问来源于stack exchange,提问作者mak47
相关产品推荐
相关产品推荐

