【问题标题】:How do I grab elements having different classes using cheerio?如何使用cheerio 抓取具有不同类的元素?
【发布时间】:2019-07-20 18:43:01
【问题描述】:

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

  1. 如何将这两个列表中的所有标签合二为一 陈述?我试过了,但没用。
  2. 从第一个列表中,我不希望带有类的 li 标签 “b_pag”。我怎样才能为它写一个选择器?像 Not 条件或 东西。

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

请参阅随附的 html 屏幕截图。html

Update2:我想忽略整个 <li class="b_pag"> 标签,但我在这里和其他地方找到的解决方案只忽略了那个标签。它下面的任何其他<li> 标签,如果有任何其他或没有类,都不会被忽略。

我找到了解决方法。我可以获取具有其他类名的<li> 标签。查看the html here。我正在考虑为前四个类使用四个不同的选择器。喜欢$(.b_algo)$(.b_ans)。但是我怎样才能抓住另外两个 <li> 有多个与之关联的类的标签呢?我无法从cheerio docs 得到一个明确的想法。希望我对你们来说足够清楚!像$(.b_ans b_mop) 这样的东西不起作用。 $("li[class=b_ans b_mop") 也没有。

【问题讨论】:

  • 是的,所有 li 标签都有一个标签和其他标签
  • 我看到了你的代码。它以 b_content 作为类获取 ol 下的所有 a 标签。我想忽略以“b_pag”为类的 li 标签。请参阅屏幕截图中的最后一个 li。这就是我想忽略的。需要所有其他 li 标签。
  • 查看此代码jsfiddle.net/roftsnap

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


【解决方案1】:

试试这个,

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

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

【讨论】:

  • $("#b_content", "b_context") 会在不存在的 b_context 下找到 b_content,所以我得到一个空结果。 “li:not(.b_pag)”是我要找的。你能告诉我你会在代码中具体写在哪里吗?我可以抓住
      $("#b_results").find("li").each((i, el) => { // something }); 那我应该在哪里插入 not 条件?
  • 给你,$("#b_results").find("li:not(.b_pag)").each((i, el) => { // something });
  • 我找到了解决这个问题的方法。不过我还有一个疑问。我怎样才能抓住这样的元素 -
  • ?这是否意味着该元素与 3 个类(a、b 和 c)相关联?
  • 是的!类似于一些引导类 ..
  • 这个问题的答案之前已经回答过了,看看这个。 link
  • 【解决方案2】:

    试试这个

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

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

    【讨论】:

    • != 确实有效,而 Dipesh Lohani 上面所说的 li:not() 也忽略了
    • 下还有其他的
      • 标记。该声明并未忽略它们。有没有办法忽略整个
      • 标记,即使它下面还有其他带有其他类的
      • 标记?例如 - <li class="b_pag"> <!--something--> <ul> <li></li> <li></li> <li></li> </ul> </li> 我需要忽略整个
    【解决方案3】:

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

    这是获取必应搜索结果的合法且更好的方式。如果您没有大量搜索要做,您可以注册此 API 的免费层。您还可以使用加入 Azure 时收到的 Azure 免费信用额度。

    【讨论】:

    • 谢谢兄弟。我一定会检查出来的:)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签