使用cheerio执行结果为空,如何修改代码


const cheerio = require('cheerio');
const html = '<html><head>123</head><body><tbody> <!-- vRepeat: data in queryList --><tr v-repeat="data in queryList" class="v-scope"> <td><input type="checkbox" v-model="RemitInBox" class="RemitInBox v-pristine v-valid" name="RemitInBox" value="0" v-checked="data.CheckFlag" v-disabled="data.FndDrc!=\'01\' || data.BusiState!=\'10\'" id="List0_RemitIn" v-click="clickBox($index,data)"></td> <td><span v-show="data.FndDrc!=\'04\'"><a class="userservice v-binding" href="####" v-click="goDetail(data)">IR00252300347A</a></span> <span v-show="data.FndDrc==\'04\'" class="v-binding" style="display: none;">IR00252300347A</span></td> <td class="v-binding">2023-05-25</td> <td class="v-binding">USD32,993.50</td> <td class="v-binding">1/FLOKSER KIMYA SANAYI VE TICARET 1...</td> <td class="v-binding">31980005000107125</td> <td><span v-show="data.FndDrc==\'01\'">入账</span> <span v-show="data.FndDrc==\'04\'" style="display: none;">退汇</span> <span v-show="!(data.FndDrc==\'04\'||data.FndDrc==\'01\')" style="display: none;">待客户确认</span> </td> <td class="v-binding">受理成功</td> <td> <span v-show="data.FndDrc==\'01\' && data.BusiState==\'10\'"> <a href="#" v-click="remitInPrint(data.BsnSrlNo)" class="userservice"> 打印 </a> </span> </td> </tr> </tbody> </body></html>';
const $ = cheerio.load(html);
const tbody = $('tbody');
const result = [];
tbody.find('tr').each((i, tr) => {
  const data = {};  
  $(tr).find('[v-repeat], [v-model]').each((j, el) => {
      const name = $(el).attr('v-repeat') || $(el).attr('v-model');
      const value = $(el).attr('v-bind:value') || $(el).val() || $(el).text();    
      data[name] = value;  
  });  
  result.push(data);
});
console.log(result);

引用chatgpt部分指引作答:
您提供的代码似乎使用 Cheerio 来解析 HTML 并从中提取数据。 但是,结果为空,因为您提供的 HTML 结构不正确。 标签应该放在

标签内。

要解决此问题,您可以通过在

内容周围添加
标记来修改 HTML 字符串。 这是您的代码的更新版本:

const cheerio = require('cheerio');

const html = '<html><head>123</head><body><table><tbody> <!-- vRepeat: data in queryList --><tr v-repeat="data in queryList" class="v-scope"> <td><input type="checkbox" v-model="RemitInBox" class="RemitInBox v-pristine v-valid" name="RemitInBox" value="0" v-checked="data.CheckFlag" v-disabled="data.FndDrc!=\'01\' || data.BusiState!=\'10\'" id="List0_RemitIn" v-click="clickBox($index,data)"></td> <td><span v-show="data.FndDrc!=\'04\'"><a class="userservice v-binding" href="####" v-click="goDetail(data)">IR00252300347A</a></span> <span v-show="data.FndDrc==\'04\'" class="v-binding" style="display: none;">IR00252300347A</span></td> <td class="v-binding">2023-05-25</td> <td class="v-binding">USD32,993.50</td> <td class="v-binding">1/FLOKSER KIMYA SANAYI VE TICARET 1...</td> <td class="v-binding">31980005000107125</td> <td><span v-show="data.FndDrc==\'01\'">入账</span> <span v-show="data.FndDrc==\'04\'" style="display: none;">退汇</span> <span v-show="!(data.FndDrc==\'04\'||data.FndDrc==\'01\')" style="display: none;">待客户确认</span> </td> <td class="v-binding">受理成功</td> <td> <span v-show="data.FndDrc==\'01\' && data.BusiState==\'10\'"> <a href="#" v-click="remitInPrint(data.BsnSrlNo)" class="userservice"> 打印 </a> </span> </td> </tr> </tbody></table></body></html>';

const $ = cheerio.load(html);
const tbody = $('tbody');
const result = [];

tbody.find('tr').each((i, tr) => {
  const data = {};
  $(tr)
    .find('[v-repeat], [v-model]')
    .each((j, el) => {
      const name = $(el).attr('v-repeat') || $(el).attr('v-model');
      const value = $(el).attr('v-bind:value') || $(el).val() || $(el).text();
      data[name] = value;
    });
  result.push(data);
});

console.log(result);

引用chatgpt如下回答:
可以尝试使用 console.log($) 打印出 $ 对象,看看是否正确地加载了 HTML 中的元素。此外,也可以尝试使用 console.log(tbody.html()) 打印出 tbody 元素的 HTML 内容,看看是否正确获取到了该元素。另外,如果 HTML 中存在动态生成的元素,cheerio 可能无法获取到这些元素,需考虑使用 puppeteer 等其他工具来模拟浏览器获取页面内容。