Scrapy如何定位并提取无class/ID属性的HTML表格内容
Scrapy无class/id属性表格提取方案
你现有代码的核心问题是XPath路径写法规避了当前节点上下文:以//开头的XPath会从整个HTML文档的根节点开始查找,所以哪怕你是从tables[0]的Selector对象调用xpath方法,//tbody依然会返回页面全部的tbody节点,无法定位到单个表格内的内容。
具体实现步骤
1. 修正相对路径查询规则
要从当前选中的table节点下查找子元素,XPath路径开头必须加.,代表基于当前节点上下文查询。比如要取第一个table下的tbody,正确写法是:
first_table_tbody = tables[0].xpath('./tbody')
2. 循环遍历所有表格提取内容
你已经拿到了包含22个表格的Selector列表,直接循环遍历每个表格,在单个表格内用相对路径提取行、单元格内容即可,示例代码如下:
import scrapy class MatchesSpider(scrapy.Spider): name = 'matches' allowed_domains = ['laxreports.sportlogiq.com'] start_urls = ['http://laxreports.sportlogiq.com/nll/GS2200.html'] def parse(self, response): # 已经匹配到页面全部22个table的Selector列表 tables = response.xpath('//table') # 遍历每个表格,table_index是表格的顺序索引(从0开始),可以用来区分不同业务的表格 for table_index, table in enumerate(tables): # 提取当前表格下的所有行(如果页面源码没有tbody标签,直接写./tr即可) rows = table.xpath('./tbody/tr') # 遍历当前表格的每一行 for row in rows: # 提取当前行所有单元格的文本内容 cells = row.xpath('./td/text()').getall() # 这里可以根据业务逻辑处理单元格内容,比如存储、打印 yield { 'table_index': table_index, # 表格序号,用来区分不同用途的表格 'row_content': cells }
补充说明
如果需要区分不同表格的业务类型,你可以手动打开目标页面,按从上到下的顺序对应table_index的值,比如table_index=0是赛事总览表、table_index=1是主队球员统计表之类的,按自己的需求过滤处理即可。
内容的提问来源于stack exchange,提问作者komradeR
相关产品推荐
相关产品推荐

