【问题标题】:Apply selector on sub elements with cheerio用cheerio在子元素上应用选择器
【发布时间】:2019-08-21 09:17:14
【问题描述】:

我发现无法在 cheerio 元素(版本 1.0.0-rc.3)上应用选择器。使用 find() 会引发错误。

const xmlText = `
<table>
  <tr><td>Foo</td><td/></tr>
  <tr><td>1,2,3</td><td>number</td></tr>
  <tr><td>A,B</td><td>char</td></tr>
  <!-- more rows -->
</table>
<table>
  <tr><td>Bar</td><td/></tr>
  <!-- more rows -->
</table>
`
const $ = cheerio.load(xmlText)
$('table').each((i, table) => {
  // TODO if first row contains Foo then map the following rows
  if (table.find("td:contains('Foo')").length > 0) {
    // ...
  }
})

类型“CheerioElement”上不存在属性“find”。

如何应用子元素的选择器?

给定的示例应该只处理带有第一行文本Foo 的表格并返回以下对象列表。

// desired result
[{ value: '1,2,3', type: 'numbner' }, { value: 'A,B', type: 'char' }, ...]

【问题讨论】:

    标签: typescript cheerio


    【解决方案1】:

    从头开始编写,我确信有更好的方法来做到这一点:

    $('table').each((i, table) => { if ($(table).find("td:contains('Foo')").length > 0) {$('tr', table).each((i, tr)=>{console.log($(tr).text())})} })
    

    【讨论】:

      【解决方案2】:

      我在each() 方法的文档中找到了答案。您必须像 $(element) 一样包装给定的 element

      if ($(table).find("td:contains('Foo')").length > 0) {
      

      我终于解决了这个问题。

      const $ = cheerio.load(xmlText)
      const isFooTable = (i: number, e: CheerioElement) =>
        $('td', e).first().text() === 'Foo'
      const result: { value: string; type: string }[] = []
      
      $('table')
        .filter(isFooTable)
        .find('tr')
        .slice(1)
        .each((_, tr) => {
          const tds = $(tr).find('td')
          result.push({
            value: tds.first().text(),
            type: tds.last().text(),
          })
        })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 2021-11-07
        • 2017-05-02
        • 2015-12-15
        相关资源
        最近更新 更多