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
}, {})