reactjs 使用cheerio在两个标签之间进行网页抓取

2nc8po8w  于 2023-01-02  发布在  React
关注(0)|答案(2)|浏览(137)

各位晚上好,
我研究了cheerio并尝试解析网站上的数据。它的结构如下,我将直接进入正文:

<body>
<form>
<div class="a">
<h3>Text A</h3>
<h4> Sub-Text A</h4>
<div class="Sub-Class A"> some text </div>
<h4> Sub-Text B</h4>
<div class="Sub-Class B"> some text </div>
<h4> Sub-Text C</h4>
<div class="Sub-Class C"> some text </div>

<h3>Text B</h3>
...
...

<h3>Text C</h3>
</div>
</form>
</body>

任务是将数据解析到从h3到下一个h3的数组中(即h3,其后所有h4和div,但到下一个h3),我开始写一个函数,但遇到了上面描述的问题,如何让函数理解我需要将h3之后的所有内容写在数组的一个元素中,但在下一个h3之前?
我目前拥有的代码:

const Nightmare = require('nightmare');
const cheerio = require('cheerio');
const nightmare = Nightmare({show: true})
nightmare  
    .goto(url)
    .wait('body')
    .evaluate(()=> document.querySelector('body').innerHTML)
    .end()
    .then(response =>{
        console.log(getData(response));
    }).catch(err=>{
        console.log(err);
    });

let getData = html => {
    data = [];
    const $ = cheerio.load(html);
    $('form div.a').each((i, elem)=>{
        data.push({

        });
    });
    return data;
}
thigvfpy

thigvfpy1#

你可以跟随“next()”元素直到你找到一个h3:

let texts = $('h3').map((i, el) => {
  let text = ""
  el = $(el)
  while(el = el.next()){
    if(el.length === 0 || el.prop('tagName') === 'H3') break
    text += el.text() + "\n"
  }
  return text
}).get()
2vuwiymt

2vuwiymt2#

我看到至少有几种方法,取决于你想要什么。
也许你想选择一个<h3>,比如说第一个,然后遍历到它后面的<h3>,收集所有的元素,忽略所有其他的<h3>标记:

const $ = cheerio.load(html);
const text = $("h3")
  .first()
  .nextUntil("h3")
  .map((i, e) => $(e).text())
  .toArray();
console.log(text);

这给出:

[
  ' Sub-Text A',
  ' some text ',
  ' Sub-Text B',
  ' some text ',
  ' Sub-Text C',
  ' some text '
]

如果你愿意,它们可以很容易地连接起来。
另一种解释是,您希望将所有<h2>段分块到单独的子数组中:

const cheerio = require("cheerio"); // 1.0.0-rc.12

const html = `<body>
<form>
<div class="a">
<h3>Text A</h3>
<h4> Sub-Text A</h4>
<div class="Sub-Class A"> some text </div>
<h4> Sub-Text B</h4>
<div class="Sub-Class B"> some text </div>
<h4> Sub-Text C</h4>
<div class="Sub-Class C"> some text </div>

<h3>Text B</h3>
<h4> B STUFF</h4>
<div class="Sub-Class D"> B STUFF </div>

<h3>Text C</h3>
<div>C STUFF</div>
</div>
</form>
</body>`;

const $ = cheerio.load(html);
const groups = [...$("h3")]
  .map(e => [...$(e).nextUntil("h3")].map(e => $(e).text()));
console.log(groups);

这给出了

[
  [
    ' Sub-Text A',
    ' some text ',
    ' Sub-Text B',
    ' some text ',
    ' Sub-Text C',
    ' some text '
  ],
  [ ' B STUFF', ' B STUFF ' ],
  [ 'C STUFF' ]
]

另见:

  • jQuery/cheerio获取标记之间的组合HTML
  • 使用jquery或cheerio查找两个标记之间的html文本

相关问题