Cheerio:SyntaxError:属性选择器格式不正确:对象全局

Cheerio: SyntaxError: Malformed attribute selector: object global?

本文关键字:不正确 对象 全局 格式 选择器 SyntaxError 属性 Cheerio      更新时间:2023-09-26

这是我的代码:

var request = require('request'),
    cheerio = require('cheerio'),
    async = require('async');
function updateCars(){
    function getReviews(body){
        var $ = cheerio.load(body);
        var year = $(this).find(".field-item").text();
    }
    async.series([
        ....
        function(callback) {
            request(site+path, function(err, resp, body){
                if(!err && resp.statusCode == 200){
                    var $ = cheerio.load(body);
                    $(".views-row").each(getReviews(body));
                }
            });
        }
    ]);
}

当我在节点控制台中运行它时,我会得到以下错误:

SyntaxError: Malformed attribute selector: object global]

我该怎么解决?

错误。。。

SyntaxError:属性选择器格式不正确:对象全局]

实际上是对的。由于这里只发布了一段有问题的代码,所以不完全清楚这是在哪里发生的,但这肯定是属性选择器中的笔误-很可能是这个。。。

答案:

$('div[id^=foo_bar'); // <-- missing the closing ]

上面的例子是一个你通常(或任何编码你正在抓取的网站的人)不会注意到的错误,因为jQuery通常会悄悄地处理这个错误。。。

Proof jQuery处理它:

var fooBars = $('a[id^="foo_bar"'); //<-- missing closing ]
$('#results').append("See... jQuery don't care about your closing ']' -" + fooBars.length)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a id="foo_bar_1">1</a>
<a id="foo_bar_2">2</a>
<a id="foo_bar_3">3</a>
<a id="foo_bim_4">4</a>
<a id="foo_bar_5">5</a>
<div id="results"></div>

解释:

错误实际上是Sizzle从cheerio下面的某个地方对你大喊大叫。当jQuery使用纯javascript实现时。。。

var fooBar = document.querySelectorAll('a[id="foo_bar"'); // <-- missing
alert(fooBar.length); // works!

Cheerio正在使用Sizzle,它不喜欢"格式错误"的属性(过去在IE 7-9中也是一个问题)。。。

与jQuery一样,[Cheerios]在文档,但与jQuery不同,它是建立在CSSSelect之上的库,它实现了大部分Sizzle选择器。