2
votes

Le marionnettiste retourne un objet vide

Lorsque j'exécute le code suivant dans la console de page que j'essaie de gratter, j'ai image .

const inputContent = await page.evaluate(() => {
return document.querySelector('#sb-site > div.sticky_footer > div:nth-child(9)'); });

Cependant, lorsque j'exécute ceci dans mon programme, la console l'enregistre et renvoie '{}'

document.querySelector('#sb-site > div.sticky_footer > div:nth-child(9)')


6 commentaires

Comment chargez-vous la page? Chargez-vous avec waitUntil: 'networkidle0' ? Essayez-vous de consolider un élément HTML sur la console nodejs ou simplement d'obtenir le texte / lien?


J'ai ajouté ce code alors maintenant il se charge complètement, j'ai également ajouté .innerHTML après le sélecteur. J'essaie de récupérer ce bloc de texte géant de l'image dans le message principal pour pouvoir en extraire le contenu


Vous essayez d'extraire du texte de l'image? : /


tbh, il est difficile d'aider si vous ne fournissez pas plus de code ou d'url, afin que nous puissions reproduire ce problème. J'ai eu affaire à beaucoup de grattage de site react / vue / angular, mais j'avais encore besoin d'informations plus spécifiques.


Non désolé, je faisais référence à l'image que j'ai postée dans mon OP. J'aimerais pouvoir vous lier mais c'est dans le panneau d'administration et je ne peux pas partager l'accès. Voici une autre image imgur.com/a/LaG8dU3


Au lieu de nous envoyer des photos, veuillez copier et coller uniquement le code que vous souhaitez dans votre question.


3 Réponses :


2
votes

Assurez-vous que la page se charge complètement avant de procéder au scraping.

page.goto(url, {waitUntil: 'networkidle0'})

Aussi, selon la documentation , .evaluate renverra une promesse , elle ne renverra pas d'élément DOM .

Il affichera {} sur la console ou la valeur à laquelle la promesse résout sur la console.


1 commentaires

Notez que l'OP utilise await lors de son appel à evaluer , donc le résultat sera la valeur à laquelle la promesse résout.



0
votes

Dans votre cas, vous essayez de sélectionner un objet dom personnalisé injecté dans la page qui conduit à un comportement étrange lors de l'utilisation du sélecteur css nth-child () . Vous devriez donc essayer de cibler directement le nœud DOM. Supposons que vous essayiez d'obtenir un élément similaire ici https://wefunder.com/chattanoogafc

Vous pouvez faire:

const inputContent = await page.evaluate(async () => {
  var elements =  document.querySelectorAll("#sb-site > div.sticky_footer > div")[3].querySelectorAll("*")[0];
  return elements.getAttribute("company-json");
});

console.log("test:" + inputContent);

Et cela devrait renvoyer le JSON que vous voulez. Vous pouvez ensuite l'analyser en utilisant JSON.parse(inputContent)


7 commentaires

J'ai ajouté .innerHTML mais maintenant il imprime undefined


Difficile à déboguer sans voir l'élément avec lequel vous essayez d'interagir. Aucune raison pour laquelle .innerHTML ne fonctionnerait pas à moins que votre sélecteur css ne soit faux ou que l'élément ne soit pas encore complètement chargé.


voici le sélecteur d'origine # sb-site> div.sticky_footer> div: nth-child (9)> wf: loader-v2 mais j'ai dû le raccourcir à celui de OP car il n'était pas ne reconnaît pas le ":". Existe-t-il un moyen d'accéder à la partie wf: loader-v2 qui, je pense, contient les informations?


Ce n'est pas un sélecteur valide @RyanSoderberg


Oui, comment puis-je accéder aux informations qu'il contient si je ne peux pas le sélectionner?


@RyanSoderberg Je l'ai fait fonctionner, j'ai édité ma réponse.


Bien, veuillez accepter ma réponse si cela a fonctionné pour vous.



7
votes

Le marionnettiste peut transférer deux types de données entre Node.js et le contexte du navigateur: des données sérialisables (c'est-à-dire des données prises en charge par JSON.stringify () / JSON.parse () ) et identifiants d'objets JavaScript (y compris les éléments DOM) - JSHandle et ElementHandle. Les versions ultérieures ont une API un peu plus compliquée (voir les méthodes ou méthodes JSHandle et ElementHandle qui les mentionnent).

page.evaluate () ne peut transférer que des données sérialisables, et au lieu de données non sérialisables, elle renvoie undefined ou des objets vides. Les éléments DOM ne sont pas sérialisables car ils contiennent des références circulaires et des méthodes.

Donc, si vous avez juste besoin d'attributs de texte ou d'élément, essayez de faire la plupart du traitement dans le contexte du navigateur et ne renvoyez que des données sérialisables.


2 commentaires

Avez-vous une chance de savoir comment collecter un tableau d'éléments en utilisant le marionnettiste puis les utiliser plus tard? ou est-ce tout simplement impossible? Par exemple. si je veux parcourir un tableau d'éléments et cliquer sur chacun d'eux, ma seule option est-elle de le faire à partir de la fonction d'évaluation?


@ switch201 Vous pouvez utiliser page.evaluateHandle () pour cela. Par exemple: gist.github.com/vsemozhetbyt/67c0d4951c79ee216d567a21d