NodeJS-解析HTML并多次查找某些字符串

时间:2019-12-09 07:59:56

标签: javascript node.js html-parsing

我正在使用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]

预先感谢:)

1 个答案:

答案 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);