我正在使用puppeteer加载网站,然后使用以下方法存储该网站的HTML:
html = await page.evaluate('new XMLSerializer().serializeToString(document.doctype) + document.documentElement.outerHTML');
这可以正常工作,并按预期方式返回html(不能使用此网站上的请求,长话短说)。
我现在需要做的是在HTML中有一个看起来像这样的块:
<ul class="styled-radio">
<li>
<input type="radio" name="variant_id" id="variant_id_118018" value="118018">
<label for="variant_id_118018">5</label>
</li>
<li>
<input type="radio" name="variant_id" id="variant_id_118019" value="118019">
<label for="variant_id_118019">6</label>
</li>
<li>
<input type="radio" name="variant_id" id="variant_id_118020" value="118020">
<label for="variant_id_118020">6,5</label>
</li>
... keeps going ...
</ul>
对于每个variant_id_xxxxxx,我需要获取xxxxxx数字值以及标签内部文本,然后将其存储为xxxxxx:innerTextHere
例如,该文本块上方的第一个文本为118018:5
如果我们然后可以将所有xxxxxx:innerTextHere值存储在数组 sizes 中,那也将非常有用,因此上述html的最终结果将为[118018:5、118019:6、118020 :6,5]
预先感谢:)
答案 0 :(得分:0)
您可以使用节点包Cherrio来达到上述效果。 请参考示例代码。
const cheerio = require('cheerio')
const data = `
<ul class="styled-radio">
<li>
<input type="radio" name="variant_id" id="variant_id_118018" value="118018">
<label for="variant_id_118018">5</label>
</li>
<li>
<input type="radio" name="variant_id" id="variant_id_118019" value="118019">
<label for="variant_id_118019">6</label>
</li>
<li>
<input type="radio" name="variant_id" id="variant_id_118020" value="118020">
<label for="variant_id_118020">6,5</label>
</li>
... keeps going ...
</ul>`;
const result = [];
const $ = cheerio.load(data);
const variants = $("input[name='variant_id']");
variants.each((index, { attribs }) => {
const { id, value } = attribs;
const label = $("label[for='" + id + "']");
result.push({
id,
value,
label: label.text()
})
})
console.log(result);