如何使用cheerio抓取具有不同类的元素?

时间:2019-02-27 05:43:23

标签: javascript node.js dom web-scraping cheerio

我正在使用node和cheerio抓取bing搜索结果。我需要从两个具有不同ID的列表中获取所有href值。

  1. 如何将两个列表中的所有标签合而为一 声明?我尝试过,但是没有用。
  2. 从第一个列表中,我不希望将li标签用于该类 “ b_pag”。如何编写选择器?如非条件或 东西。

$("a", ["#b_content", "#b_context"]).each((index, element) => { const href = $(element).attr("href"); links.push(href); });

请参阅附件中的html屏幕截图。html

Update2:我当时想忽略整个标签,但是我在这里和其他地方找到的解决方案都忽略了该标签。它下面的任何其他

  • 标记(具有任何其他类别或没有类别)不会被忽略。

    我找到了解决方法。我可以获取具有其他类名的

  • 标记。签出the html here。我正在考虑为前四个类使用四个不同的选择器。像$(.b_algo)$(.b_ans)。但是,如何获取其他两个具有多个相关类的
  • 标记?我无法从cheerio docs得到一个清晰的主意。希望我对你们足够清楚! $(.b_ans b_mop)之类的东西不起作用。 $("li[class=b_ans b_mop")也没有。

  • 3 个答案:

    答案 0 :(得分:2)

    尝试一下,

    $("#b_content", "#b_context").each(function(i, elem) {
            array[i] = {
                 a: $(this).find("a").attr("href")
             };
          });`
    

    要选择类别“ b_pag”以外的“ li”,请使用li:not( .b_pag )

    答案 1 :(得分:1)

    尝试这个

    $(".b_content li[class!='b_pag']").find("a").each((index, element) => { const href = $(element).attr("href"); console.log(href); });

    如果要忽略类,请使用带有相应标记的属性选择器,例如 li [class!='b_pag']

    答案 2 :(得分:1)

    尝试改用Bing Web搜索API:https://azure.microsoft.com/en-us/services/cognitive-services/bing-web-search-api/

    这是获取必应搜索结果的合法且更好的方法。如果您无需进行大量搜索,则可以注册此API的免费层。您还可以使用加入Azure时收到的Azure免费积分。