Cheerio - 如何从每个 dt 行获取相应的 dd 标签
Cheerio - How to get corresponding dd tag from each dt line
在使用 Cheerio 时遇到一些问题并找到了正确的语法来解决我的问题。
<section class="panel">
<dl class="definition-list definition-list--inline">
<dt>Sektor</dt>
<dd>Privat</dd>
<dt>Sted</dt>
<dd>Øvre Banegate 28, 4014 Stavanger</dd>
<dt>Bransje</dt>
<dd>Arkitektur, areal og interiør,</dd>
<dd>Bygg og anlegg,</dd>
<dd>Konsulent og rådgivning</dd>
<dt>Stillingsfunksjon</dt>
<dd>Arkitekt og planlegging / Arealplanlegger,</dd>
<dd>Arkitekt og planlegging / Arkitekt,</dd>
<dd>Arkitekt og planlegging</dd>
</dl>
</section>
我需要找到正确的语法来在正确的 dt 之后获取 dd。我用 Puppeteer 做对了,但我没能用 Cheerio 做对。
到目前为止我已经完成了
$('body > main > div > div.grid > div.grid__unit.u-r-size2of3 > div > section:nth-child(9) > dl dd').each(function(i, elem) {
const titleNode = $(elem);
const titleText = titleNode.text();
titleList5.push(titleText);
});
非常感谢任何帮助:)
为每个 <dt>
.
生成一个包含 <dd>
数组的 Map
const map = new Map();
let group;
$('.panel dl.definition-list').children().each((i, elem) => {
switch (elem.nodeName.toLowerCase()) {
case "dt":
// start a list for this <dt>
map.set(elem, group = []);
break;
case "dd":
// add <dd> to the list for the current <dt>; if there is one.
group?.push(elem);
break;
default:
// just in case;
// anyways, where would <dd>s belong that are after something else than a <dt>?
// ignore them
group = null;
}
});
console.log(...map.entries());
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="panel">
<dl class="definition-list definition-list--inline">
<dt>Sektor</dt>
<dd>Privat</dd>
<dt>Sted</dt>
<dd>Øvre Banegate 28, 4014 Stavanger</dd>
<dt>Bransje</dt>
<dd>Arkitektur, areal og interiør,</dd>
<dd>Bygg og anlegg,</dd>
<dd>Konsulent og rådgivning</dd>
<dt>Stillingsfunksjon</dt>
<dd>Arkitekt og planlegging / Arealplanlegger,</dd>
<dd>Arkitekt og planlegging / Arkitekt,</dd>
<dd>Arkitekt og planlegging</dd>
</dl>
</section>
使用 nextUntil 因为不止一个而且他们是兄弟姐妹:
let data = $('dt').get().reduce((acc, dt, i) => {
let key = $(dt).text()
let value = $(dt).nextUntil('dt').get().map(dl => $(dl).text())
acc[key] = value
return acc
}, {})
在使用 Cheerio 时遇到一些问题并找到了正确的语法来解决我的问题。
<section class="panel">
<dl class="definition-list definition-list--inline">
<dt>Sektor</dt>
<dd>Privat</dd>
<dt>Sted</dt>
<dd>Øvre Banegate 28, 4014 Stavanger</dd>
<dt>Bransje</dt>
<dd>Arkitektur, areal og interiør,</dd>
<dd>Bygg og anlegg,</dd>
<dd>Konsulent og rådgivning</dd>
<dt>Stillingsfunksjon</dt>
<dd>Arkitekt og planlegging / Arealplanlegger,</dd>
<dd>Arkitekt og planlegging / Arkitekt,</dd>
<dd>Arkitekt og planlegging</dd>
</dl>
</section>
我需要找到正确的语法来在正确的 dt 之后获取 dd。我用 Puppeteer 做对了,但我没能用 Cheerio 做对。 到目前为止我已经完成了
$('body > main > div > div.grid > div.grid__unit.u-r-size2of3 > div > section:nth-child(9) > dl dd').each(function(i, elem) {
const titleNode = $(elem);
const titleText = titleNode.text();
titleList5.push(titleText);
});
非常感谢任何帮助:)
为每个 <dt>
.
<dd>
数组的 Map
const map = new Map();
let group;
$('.panel dl.definition-list').children().each((i, elem) => {
switch (elem.nodeName.toLowerCase()) {
case "dt":
// start a list for this <dt>
map.set(elem, group = []);
break;
case "dd":
// add <dd> to the list for the current <dt>; if there is one.
group?.push(elem);
break;
default:
// just in case;
// anyways, where would <dd>s belong that are after something else than a <dt>?
// ignore them
group = null;
}
});
console.log(...map.entries());
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="panel">
<dl class="definition-list definition-list--inline">
<dt>Sektor</dt>
<dd>Privat</dd>
<dt>Sted</dt>
<dd>Øvre Banegate 28, 4014 Stavanger</dd>
<dt>Bransje</dt>
<dd>Arkitektur, areal og interiør,</dd>
<dd>Bygg og anlegg,</dd>
<dd>Konsulent og rådgivning</dd>
<dt>Stillingsfunksjon</dt>
<dd>Arkitekt og planlegging / Arealplanlegger,</dd>
<dd>Arkitekt og planlegging / Arkitekt,</dd>
<dd>Arkitekt og planlegging</dd>
</dl>
</section>
使用 nextUntil 因为不止一个而且他们是兄弟姐妹:
let data = $('dt').get().reduce((acc, dt, i) => {
let key = $(dt).text()
let value = $(dt).nextUntil('dt').get().map(dl => $(dl).text())
acc[key] = value
return acc
}, {})