jquery 选择器:一个不常见的用例
jquery selectors: an uncommon use case
我必须解析这样组织的 html 页面:
<li id="list">
<a id="cities">Cities</a>
<ul>
<li>
<a class="region" title="liguria">Liguria</a>
<ul>
<li>
<a class="genova">Genova</a>
</li>
<li>
<a class="savona">Savona</a>
</li>
</ul>
</li>
<li>
<a class="region" title="lazio">Lazio</a>
<ul>
<li>
<a class="roma">Roma</a>
</li>
</ul>
</li>
</ul>
</li>
我需要提取所有城市的列表。我不关心地区...
我正在使用 node.js 中的 cheerio,但我在标签中添加了 jquery,因为 cheerio 使用 jquery 风格的选择器(据我所知...)。
我提供了这个部分解决方案,部分有效(它只列出了第一个区域组城市...):
$('li[id="list"] li li').each(function(i, elem) {
console.log('city:', elem.children[0].next.children[0].data);
});
如您所见,我很困惑...:-(
有什么线索吗?
尝试:
$('li#list ul li ul li a').each(function() {
console.error("City: "+$(this).html());
});
如下所述,选择器可以只是 $('li#list li li a')
.
试试这个
$('li[id="list"] ul li').each(function(i, elem) {
...work on each li containing the region ...
});
注意当使用id选择器时,由于根据定义id是唯一的,选择器不需要任何其他限定符,例如标签名称。通常,如果您匹配 ID 中的子字符串,您只会使用 tagname[id...]
:^ - 在开头,$ - 在结尾或 * - 任何地方。
另一种方法是使用 :not()
排除应排除的 a
元素:
$('#list a:not(.region,#cities)').each(function(i, a) {
console.log( i, a.innerHTML );
});
您可以使用多种有效选择器选项:
#list ul ul a
#list li li a
#list ul ul li a
$('#list a:not(.region,#cities)').each(function(i, a) {
console.log( i, a.innerHTML );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li id="list">
<a id="cities">Cities</a>
<ul>
<li>
<a class="region" title="liguria">Liguria</a>
<ul>
<li>
<a class="genova">Genova</a>
</li>
<li>
<a class="savona">Savona</a>
</li>
</ul>
</li>
<li>
<a class="region" title="lazio">Lazio</a>
<ul>
<li>
<a class="roma">Roma</a>
</li>
</ul>
</li>
</ul>
</li>
AND 要获取名为 cities
的数组中的所有城市,您可以使用 jQuery .map()
方法:
var cities = $('#list li li a').map(function() {
return this.innerHTML;
}).get();
var cities = $('#list li li a').map(function() {
return this.innerHTML;
}).get();
console.log( cities );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li id="list">
<a id="cities">Cities</a>
<ul>
<li>
<a class="region" title="liguria">Liguria</a>
<ul>
<li>
<a class="genova">Genova</a>
</li>
<li>
<a class="savona">Savona</a>
</li>
</ul>
</li>
<li>
<a class="region" title="lazio">Lazio</a>
<ul>
<li>
<a class="roma">Roma</a>
</li>
</ul>
</li>
</ul>
</li>
我必须解析这样组织的 html 页面:
<li id="list">
<a id="cities">Cities</a>
<ul>
<li>
<a class="region" title="liguria">Liguria</a>
<ul>
<li>
<a class="genova">Genova</a>
</li>
<li>
<a class="savona">Savona</a>
</li>
</ul>
</li>
<li>
<a class="region" title="lazio">Lazio</a>
<ul>
<li>
<a class="roma">Roma</a>
</li>
</ul>
</li>
</ul>
</li>
我需要提取所有城市的列表。我不关心地区... 我正在使用 node.js 中的 cheerio,但我在标签中添加了 jquery,因为 cheerio 使用 jquery 风格的选择器(据我所知...)。
我提供了这个部分解决方案,部分有效(它只列出了第一个区域组城市...):
$('li[id="list"] li li').each(function(i, elem) {
console.log('city:', elem.children[0].next.children[0].data);
});
如您所见,我很困惑...:-(
有什么线索吗?
尝试:
$('li#list ul li ul li a').each(function() {
console.error("City: "+$(this).html());
});
如下所述,选择器可以只是 $('li#list li li a')
.
试试这个
$('li[id="list"] ul li').each(function(i, elem) {
...work on each li containing the region ...
});
注意当使用id选择器时,由于根据定义id是唯一的,选择器不需要任何其他限定符,例如标签名称。通常,如果您匹配 ID 中的子字符串,您只会使用 tagname[id...]
:^ - 在开头,$ - 在结尾或 * - 任何地方。
另一种方法是使用 :not()
排除应排除的 a
元素:
$('#list a:not(.region,#cities)').each(function(i, a) {
console.log( i, a.innerHTML );
});
您可以使用多种有效选择器选项:
#list ul ul a
#list li li a
#list ul ul li a
$('#list a:not(.region,#cities)').each(function(i, a) {
console.log( i, a.innerHTML );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li id="list">
<a id="cities">Cities</a>
<ul>
<li>
<a class="region" title="liguria">Liguria</a>
<ul>
<li>
<a class="genova">Genova</a>
</li>
<li>
<a class="savona">Savona</a>
</li>
</ul>
</li>
<li>
<a class="region" title="lazio">Lazio</a>
<ul>
<li>
<a class="roma">Roma</a>
</li>
</ul>
</li>
</ul>
</li>
AND 要获取名为 cities
的数组中的所有城市,您可以使用 jQuery .map()
方法:
var cities = $('#list li li a').map(function() {
return this.innerHTML;
}).get();
var cities = $('#list li li a').map(function() {
return this.innerHTML;
}).get();
console.log( cities );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li id="list">
<a id="cities">Cities</a>
<ul>
<li>
<a class="region" title="liguria">Liguria</a>
<ul>
<li>
<a class="genova">Genova</a>
</li>
<li>
<a class="savona">Savona</a>
</li>
</ul>
</li>
<li>
<a class="region" title="lazio">Lazio</a>
<ul>
<li>
<a class="roma">Roma</a>
</li>
</ul>
</li>
</ul>
</li>