如何使用XPath抓取页面指定表格,解决仅能获取首个表格的问题
解决方案
问题根因
- XPath表达式存在引号嵌套冲突:原代码里XPath字符串外层用了单引号,内层
contains(@class, 'xxx')也用了单引号,Python会把字符串截断,导致语法错误,XPath根本没有正常执行 - 目标站点有基础反爬校验:未携带合法User-Agent请求头时,站点会返回拦截页面,不存在要匹配的表格元素,自然没有返回结果
- 类名匹配可能存在拼写误差:要匹配的class属性值需要和页面实际渲染的完全一致,拼写错误、大小写错误都会导致匹配失败
完整可运行实现(针对你提供的目标页面)
import requests import lxml.html as lh url = "https://biznes.interia.pl/gieldy/notowania-gpw/profil-akcji-mab,wId,6852,tab,przebieg-sesji" # 加请求头避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers) doc = lh.fromstring(page.content) # ------------------- 方法1:按索引抓取任意表格 ------------------- # 先获取页面所有表格,索引从0开始计数,要第n个表格就取all_tables[n-1] all_tables = doc.xpath('//table') # 比如抓取第2个表格的所有行 target_table = all_tables[1] tr_elements = target_table.xpath('.//tr') # ------------------- 方法2:按类名精准定位指定表格 ------------------- # 注意XPath字符串外层用双引号,内层class判断用单引号,避免引号冲突 # tr_elements = doc.xpath("//table[contains(@class, '你要匹配的表格class名')]//tr") # 输出表格表头 for t in tr_elements[0]: name = t.text_content().strip() print(name)
使用说明
如果你不清楚表格的索引或者类名,可以先打印所有表格的class属性和对应索引,确认你要抓取的目标表格特征:
for idx, table in enumerate(all_tables): print(f"表格索引:{idx},class属性:{table.get('class')}")
匹配class时如果要完全匹配而非包含,可以把contains(@class, 'xxx')换成@class='xxx'即可。
内容的提问来源于stack exchange,提问作者mkultra
相关产品推荐
相关产品推荐

