2016-01-10 29 views
6

Mam niektóre HTML tak:Cheerio: Jak wybrać element według treści tekstowej?

<span id="cod">Code:</span> <span>12345</span> 
<span>Category:</span> <span>faucets</span> 

Chcę pobrać nazwę kategorii ("baterie"). To moja próba:

var $ = cheerio.load(html.contents); 
var category = $('span[innerHTML="Category:"]').next().text(); 

Ale to nie działa (modyfikator innerHTML niczego nie wybrać).

Jakaś wskazówka?

+0

Nie możesz podać swoich przedmiotów w klasie? –

+1

Produkt nie jest "mój" :-) Parsuję stronę zewnętrzną Nie kontroluję ... – MarcoS

Odpowiedz

9

Powodem Twój kod nie działa dlatego [innerHTML] jest selektor atrybutu, a innerHTML nie jest atrybutem na elemencie (co oznacza, że ​​nic nie jest zaznaczone).

Można filtrować elementy span na podstawie ich tekstu. W poniższym przykładzie .trim() służy do obcięcia wszelkich białych znaków. Jeśli tekst jest równy "Kategoria:", element ten jest zawarty w przefiltrowanym zestawie zwróconych elementów.

var category = $('span').filter(function() { 
    return $(this).text().trim() === 'Category:'; 
}).next().text(); 

Powyższy fragment kodu będzie filtrować elementy, jeśli ich tekst jest dokładnie „Kategoria:”. Jeśli chcesz, aby wybrać elementy, jeśli ich tekst zawiera że ciąg, można użyć przełącznika :contains (jak wskazano w komentarzach):

var category = $('span:contains("Category:")').next().text(); 

Alternatywnie, stosując metodę .indexOf() będzie działać także:

var category = $('span').filter(function() { 
    return $(this).text().indexOf('Category:') > -1; 
}).next().text(); 
+1

Działa jak wdzięk, dzięki. Nie wiedziałem o 'filter()', czuję się całkiem głupio ... :-( – MarcoS

+1

Jeśli chce sprawdzić, czy zawiera ciąg, może również użyć '$ ('span: contains (" Kategoria: ")") ' – Paulpro

+0

@Paulpro Czy Cheerio ma selektor': contains'? Sprawdziłem [dokumentację] (https://github.com/cheeriojs/cheerio), i nie widziałem go tam, więc –