Cheerio: SyntaxError: Zniekształcony selektor atrybutów: obiekt globalny?

Oto mój kod:

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));
                }
            });
        }
    ]);
}

Kiedy uruchamiam go w konsoli węzła, pojawia się następujący błąd:

SyntaxError: Malformed attribute selector: object global]

Jak mogę to naprawić?


person Michael    schedule 17.09.2014    source źródło
comment
Co to jest śledzenie pełnego stosu? Do którego wiersza odnosi się błąd?   -  person mscdex    schedule 17.09.2014


Odpowiedzi (1)


Błąd...

SyntaxError: Zniekształcony selektor atrybutów: obiekt globalny]

Rzeczywiście jest na miejscu. Ponieważ zamieszczono tutaj tylko fragment niewłaściwego kodu, nie jest do końca jasne, gdzie to się dzieje, ale z pewnością jest to błąd pisarski w selektorze atrybutów - i najprawdopodobniej chodzi o to...

Odpowiedź:

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

Powyższy przykład to błąd, którego normalnie (lub ktokolwiek kodujący witrynę, którą przeglądasz) nie zauważyłbyś, ponieważ jQuery zwykle po cichu radzi sobie z tym błędem...

Proof jQuery Handles It:

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>

Wyjaśnienie:

W rzeczywistości błąd polega na tym, że Sizzle krzyczy na Ciebie skądś poniżej cheerio. Chociaż jQuery wykorzystuje czystą implementację JavaScript...

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

Cheerio używa Sizzle, który nie lubi „zniekształconego” atrybutu (kiedyś był to problem również w IE 7-9)…

Podobnie jak jQuery, podstawowa metoda [Cheerios] służąca do wybierania elementów w dokumencie, ale w przeciwieństwie do jQuery jest zbudowana na bazie biblioteki CSSSelect, która implementuje większość selektorów Sizzle.

person wahwahwah    schedule 14.04.2016