Dart网页爬取问题:compressedBalance返回空数组,pklist正常
问题排查与解决方案
1. 调整CSS选择器匹配逻辑
你的选择器span.js-balance-bitcoin > span语法本身正确,但可以尝试改用后代选择器(移除>),兼容可能存在的DOM嵌套细节差异:
List<Map<String, dynamic>> compressedBalance = webScraper.getElement('span.js-balance-bitcoin span', []);
后代选择器会匹配所有嵌套在span.js-balance-bitcoin下的span元素,覆盖更多场景。
2. 排查动态渲染问题
如果目标元素是通过JavaScript动态生成的,web_scraper这类静态爬取工具无法捕获动态DOM。这种情况需要用支持浏览器渲染的库,比如puppeteer-dart:
import 'package:puppeteer/puppeteer.dart'; void main() async { var browser = await puppeteer.launch(); var page = await browser.newPage(); await page.goto('你的目标页面URL'); // 等待目标元素加载完成 await page.waitForSelector('span.js-balance-bitcoin'); // 提取所有子span的文本内容 var balances = await page.evaluate(''' () => Array.from(document.querySelectorAll('span.js-balance-bitcoin > span')).map(item => item.textContent.trim()) '''); print(balances); await browser.close(); }
3. 明确指定提取属性
web_scraper的getElement方法第二个参数是需要提取的属性列表,若要获取元素文本,需显式传入'text':
List<Map<String, dynamic>> compressedBalance = webScraper.getElement('span.js-balance-bitcoin > span', ['text']); // 输出提取到的文本 compressedBalance.forEach((item) => print(item['text']));
仅传空数组可能无法正确提取元素内容,导致返回结果看起来为空。
4. 验证爬取的原始HTML
爬取到的页面HTML可能和你手动查看的不一致(比如服务器返回静态内容不含动态渲染元素),可以先打印完整页面内容确认:
String rawHtml = webScraper.getPageContent(); print(rawHtml);
检查输出中是否存在span.js-balance-bitcoin及其子元素,若不存在则说明是页面加载或反爬机制导致的问题。
内容的提问来源于stack exchange,提问作者Fathan Akram
相关产品推荐
相关产品推荐

