所以我正在使用cheerio.js
编写一个网页抓取应用程序。事情进展顺利,直到我注意到cheerio
$('tbody tr')
什么也没有返回,而当我在chrome中打开同一个网站时,jquery
$('tbody tr')
返回表体中的所有行。在cheerio
的身体里,没有人。结构类似于<table><theader></theader><tr></tr><tr></tr></table>
。Chrome做了这个改变吗?cheerio是否错误地传递了HTML响应?
以下3个html代码片段在html浏览器中呈现时看起来相同,但原始代码略有不同。
-
源代码中没有
thead
没有tbody
<table><tr><td>row1</td></tr><tr><td>row2</td></tr></table>
-
源代码中没有
tbody
<table><thead></thead><tr><td>row1</td></tr><tr><td>row2</td></tr></table>
-
源代码中没有
tbody
和thead
<table><tbody><tr><td>row1</td></tr><tr><td>row2</td></tr></tbody></table>
根据w3schools.com浏览器可以使用thead
, tbody
, tfoot
元素来独立于页眉和页脚来滚动表体。
浏览器还可以在使用DOM进行显示之前对其进行优化、规范化或修改,只要使用的DOM按预期呈现即可。
在您的示例中,cheerio
解析器按原样读取一些源代码(node.js
请求的结果)并创建其内存中的DOM表示,您可以稍后遍历/修改。
而jQuery
在浏览器运行时读取html浏览器解析和处理的规范化和优化的DOM。
虽然这两个dom可能不同,但它们在呈现给用户时看起来是一样的,所以这不是bug,这是一个特性