如何使用Scrapy抓取无class、id动态变化的HTML标签数据?
问题根源
response.css('tbody').getall()无返回结果的核心原因:浏览器开发者工具Elements面板中显示的<tbody>标签,是浏览器解析HTML时自动为表格补全的元素,网站服务端原始返回的HTML源码里根本不存在<tbody>标签,直接匹配该标签自然拿不到任何内容。
具体实现方案
- 校验原始响应结构
不要直接参考浏览器调试工具里渲染后的DOM结构,先执行view(response)查看爬虫实际爬取到的页面内容,或者打印response.text核对源码,你会发现单套房产信息直接被包裹在独立的<table>标签内,没有tbody层级嵌套。 - 提取所有房产表格
直接使用response.css('table')即可获取页面上所有对应单套房产信息的表格集合。 - 遍历表格提取成交价格
成交价格的固定文本特征是带$符号、为千分位格式的金额,用正则匹配该特征提取的鲁棒性最高,不会受表格列顺序调整影响,参考代码如下:
import re # 匹配$开头的千分位金额格式 price_re = re.compile(r'\$\d{1,3}(?:,\d{3})+') # 拿到所有房产表格 all_property_tables = response.css('table') for table in all_property_tables: # 提取当前表格下所有单元格的文本 cell_texts = table.css('td ::text').getall() for text in cell_texts: cleaned_text = text.strip() price_match = price_re.search(cleaned_text) if price_match: deal_price = price_match.group() # 后续存储或处理成交价格即可 print(deal_price) break
- 注意事项:如果初始请求拿不到完整内容,给请求加上常规浏览器的User-Agent请求头即可,该站点无强反爬、无动态JS渲染内容,不需要额外使用Selenium/Playwright等渲染工具。
内容的提问来源于stack exchange,提问作者CountDOOKU
相关产品推荐
相关产品推荐

