3
votes

Comment puis-je récupérer des éléments de différentes classes en utilisant cheerio?

Je gratte les résultats de recherche bing en utilisant node et cheerio. Je dois récupérer toutes les valeurs href de deux listes qui ont des ID différents.

  1. Comment puis-je récupérer toutes les balises de ces deux listes en une déclaration? J'ai essayé mais cela n'a pas fonctionné.
  2. De la première liste, je ne veux pas les balises li avec la classe "b_pag". Comment puis-je écrire un sélecteur pour cela? Comme une condition non ou quelque chose.

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

Reportez-vous à la capture d'écran ci-jointe pour le code HTML. html

Update2: Je voulais ignorer toute la balise

  • , mais les solutions que j'ai trouvées ici et ailleurs ignoraient juste cette balise. Toute autre balise
  • en dessous, qui a une autre ou aucune classe, n'est pas ignorée.

    J'ai trouvé un moyen de contourner cela. Je pourrais saisir les balises

  • qui ont d'autres noms de classe. Consultez le code HTML ici . Je pense utiliser quatre sélecteurs différents pour les quatre premières classes. Comme $ (. B_algo) ou $ (. B_ans) . Mais comment puis-je récupérer les deux autres balises
  • auxquelles plusieurs classes sont associées? Je n'ai pas pu me faire une idée claire des cheerio docs . J'espère que je suis assez clair pour vous les gars! Quelque chose comme $ (. B_ans b_mop) ne fonctionnait pas. $ ("li [class = b_ans b_mop") non plus.


  • 4 commentaires

    tous les li contiennent-ils une balise ? consultez mon travail autour. jsfiddle.net/apmnky0b


    ouais toutes les balises li ont une balise avec d'autres balises


    J'ai vu votre code. Il obtient toutes les balises a sous ol avec b_content comme classe. Je veux ignorer la balise li qui a "b_pag" comme classe. Voir le dernier li dans la capture d'écran. C'est ce que je veux ignorer. Toutes les autres balises li sont nécessaires.


    consultez ce code jsfiddle.net/roftsnap


    3 Réponses :


    2
    votes

    Essayez ceci,

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

    Pour sélectionner "li" sauf la classe "b_pag", utilisez li: not (.b_pag)

    p >


    7 commentaires

    $ ("# b_content", "b_context") trouvera b_content sous b_context, qui n'existe pas, donc j'obtiens un résultat vide. le "li: not (.b_pag)" est ce que je cherchais. Pouvez-vous me dire où l'écririez-vous exactement dans le code? Je peux saisir les

      $ (" # b_results "). Find (" li "). Each ((i, el) => { // quelque chose}); Alors où dois-je insérer la condition not?


      Voilà, $ ("# b_results"). Find ("li: not (.b_pag)"). Each ((i, el) => {// quelque chose});


      J'ai trouvé un moyen de contourner ce problème. J'ai un autre doute cependant. comment puis-je saisir un élément comme celui-ci -

    1. ? cela signifie-t-il que cet élément est associé à 3 classes (a, b et c)?


      Oui ! Similaire à certaines classes de bootstrap ..


      s'il y a un

    2. et un autre
    3. et que je fais quelque chose comme $ (". a") , alors il saisit ces deux éléments. existe-t-il un moyen de passer plusieurs classes dans un seul sélecteur? afin que je puisse saisir seulement le deuxième
    4. en utilisant peut-être quelque chose comme `$ (" a b ").


      La réponse à cette question a déjà été répondue, vérifiez ceci. lien


      pourriez-vous m'aider avec ceci ? @Dipesh



    1
    votes

    Essayez celui-ci

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

    si vous voulez ignorer la classe, utilisez le sélecteur d'attribut avec la balise correspondante comme ceci li[class!='b_pag' Often


    1 commentaires

    Le! = Fonctionne et le li: not () comme Dipesh Lohani l'a dit ci-dessus ignore également le

  • et
  • sous
  • . Ils ne sont pas ignorés par cette déclaration. Existe-t-il un moyen d'ignorer la balise
  • entière même s'il y a d'autres balises
  • en dessous avec une autre classe? par exemple -
  • Je dois ignorer le tout


  • 1
    votes

    Essayez plutôt d'utiliser l'API Bing Web Search: https://azure.microsoft.com/en-us/services/cognitive-services/bing-web-search-api/

    C'est le meilleur moyen légal d'obtenir les résultats de recherche Bing. Vous pouvez vous inscrire au niveau gratuit de cette API, si vous n'avez pas beaucoup de recherches à faire. Vous pouvez également utiliser le crédit gratuit Azure, que vous recevez lorsque vous rejoignez Azure.


    1 commentaires

    Merci mec. Je vais sûrement le vérifier :)