Open Eliselalique opened 6 years ago
-> Xpath des scrapers à régler
En copiant la spider telle quelle, j'arrive à avoir les images et les descriptions en local Je rencontre toutefois le problème de récupérer toutes les images de tous les projets pour chaque projets
Si mon souvenir est exact, @JulienParis m'a dit que les mêmes xpath sont lancés à la fois sur les pages "listes" et sur les pages "détail". Et dans le cas de ce site, le HTML est très proche pour ces deux pages, donc le xpath d'image sur la page "détail" (où il n'y a qu'une seule image), quand utilisé sur la page "liste" (où il y a toutes les images de tous les projets) ramène tout
Côté solution, il existe sûrement un xpath complexe et subtile qui permet de différencier les deux pages remettre en question cette partie du design d'OpenScrapper est une autre option
différencier les deux pages
Pour les 3 pages de liste, document.body.querySelectorAll('*').length
donne des valeurs autour de 950-1100
Pour quelques pages projet que j'ai regardé, document.body.querySelectorAll('*').length
donne une valeur autour de 300-350
Une idée peut être de discriminer par le nombre d'éléments derrière le body avec un truc genre //body[count(//*) > 700]
Trouvé un xpath qui fonctionne pour les images :
//body[count(//*) < 700]//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//svg/following-sibling::img/@src
Les images principales ont un filtre SVG qui est défini en sibling précédent
Avec /html/body/div/div/div[4]/div/main/div[2]/div[2]/div/div/div[2]/div[1][h6 or p]//text()
(!) j'arrive à avoir la plupart des résumés (pas encore tous), mais je crois que le même problème d'ordre des paragraphes que #255 vient se rajouter
Trouvé une idée pour récupérer le résumé :
string(//body[count(//*) < 700]//div[@id="SITE_PAGES"]//*[not(self::style or self::script)][string-length(text()) >= 50])
[string-length(text()) >= 50]
signifie de récupérer tout élément de la page qui a plus de 50 caractères. C'est un peu grossier, mais ça a l'air de faire l'affaire
J'avais essayé //body/...//*[not(self::style or self::script)][string-length(text()) >= 50]
et j'avais le même problème d'ordre des paragraphes (dont je suis de plus en plus convaincu qu'il s'agit d'un bug de la bibliothèque)\
L'astuce string(...)
a ceci de cool qu'elle a l'air de récupérer les éléments dans l'ordre... mais les paragraphes ne sont pas conservés... :-/ on n'a qu'à dire que ça peut aller pour le moment et on verra si ça devient un problème grave
Pour une raison qui m'échappe complètement, en local, tous les projets ont une image avec //body[count(//*) < 700]//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//svg/following-sibling::img/@src
, mais en prod, environ seulement la moitié des images est récupéré
En local, j'ai la branche master
actuelle
@JulienParis est-ce que le cas pour le serveur de prod ?
on peut récupérer les résumés/descriptions avec .//div[@class="txtNew"]//p[@class="font_7" or @class="font_8"]//text()
: le problème vient du site (ou de son développeur) qui affiche les textes avec des classes, des positions différentes selon les articles...
mais moi non plus j'arrive pas à m'expliquer pourquoi ni .//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//img/@src
ni //body[count(//*) < 700]//div[@id="SITE_PAGES"]//div[contains(@id,"comp-")]//svg/following-sibling::img/@src
ne fonctionnent pas correctement (1 image sur 2 ??? WTF ??? pas du tout ou toutes je comprendrais, mais là)...
J'ai aussi tenté de récupérer les images avec .//div[contains(@class,'style-')]/div/img/@src
: ca marche dans le plugin de firefox mais pas tout le temps avec scrappy... :/
Pour la moitié des projets Coorace : -> La description est vide : "partager" -> Il n'y a pas de photos Alors que ces deux informations existent bien sur le site de COORACE