如何用Node.js/Cheerio/Axios/Express抓取网页隐藏DOM元素
你爬虫里用的类jQuery选择器(Node.js爬虫场景一般是cheerio库)不会因为元素带有hidden属性就匹配不到,只要节点存在于你拿到的HTML源码里,直接用属性选择器定位即可,抓取逻辑和普通可见元素没有本质区别。
- 定位目标节点用属性选择器
div[hidden],可以直接匹配所有带hidden属性的div元素 - 为了避免匹配到页面里其他无关的隐藏div,提取文本后加一层格式校验,确认内容是
https://doi.org/开头的DOI链接再存入结果,避免混入脏数据 - 注意不要用
:visible这类过滤可见元素的选择器,会自动把带hidden属性的节点排除掉
代码修改示例
你可以在原有抓取标题的逻辑基础上,增加DOI抓取逻辑,注意要通过单篇文章的外层父节点关联标题和对应DOI,避免出现内容错位:
const articles = [] $('.js-article-title', html).each(function () { // 提取标题,trim去掉首尾多余的换行、空格 const title = $(this).text().trim() const currentArticle = { title } // 先定位到当前标题所属的单篇文章外层容器,你需要根据实际页面DOM调整closest里的选择器 // 常见的文章外层容器标签/类名可以是article、.list-item、.article-card等 const articleWrapper = $(this).closest('article, .article-list-item') // 在当前文章容器内查找带hidden属性的div articleWrapper.find('div[hidden]').each(function () { const hiddenContent = $(this).text().trim() // 校验内容为DOI链接才存入 if (hiddenContent.startsWith('https://doi.org/')) { currentArticle.doi = hiddenContent } }) articles.push(currentArticle) })
如果测试时发现选择器匹配不到,可以先直接全局搜$('div[hidden]', html)打印所有匹配到的内容,确认目标节点确实存在于你拿到的HTML源码里(部分站点的隐藏内容是前端JS动态渲染的,这种情况需要先拿到渲染后的页面源码再做解析)。
内容的提问来源于stack exchange,提问作者doingmybest
相关产品推荐
相关产品推荐

