Je voudrais demander votre aide pour un problème que j'essaie de résoudre impliquant XPaths.Généraliser XPaths
J'essaie de généraliser plusieurs chemins X fournis par un utilisateur pour obtenir un XPath qui correspondrait le mieux à tous les exemples fournis. C'est pour un système de raclage web que je construis.
Par exemple: Si l'utilisateur donne les XPath suivants (chacun montrant un lien dans la section 'Spotlight' de la page Google Nouvelles)
bons exemples:
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3] /div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[1]/div[2]/a[@id='MAE4AUgAUABgAmoCdXM']/span
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[6]/div[2]/a[@id='MAE4AUgFUABgAmoCdXM']/span
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[12]/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span
Mauvais exemples: (pointant vers un lien dans une autre section)
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='lt-col']/div[2]/div[@id='replaceable-section-blended']/div[1]/div[4]/div/h2/a[@id='MAA4AEgFUABgAWoCdXM']/span
Il devrait pouvoir généraliser et produire une expression xpath qui sélectionnerait tous les liens dans la section 'Spotlight'. (Il devrait être en mesure de jeter le XPath incorrecte donnée)
XPath Généralisée
/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span
Pourriez-vous me conseiller sur la façon de bien vouloir aller à ce sujet. J'envisageais d'utiliser la plus longue stratégie de sous-chaîne commune mais cela serait trop généralisé si un mauvais exemple est donné (comme le quatrième exemple donné) Y at-il des bibliothèques ou des logiciels open source qui ont été faits dans ce domaine?
J'ai vu quelques messages similaires (finding common ancestor from a group of xpath? et Howto find the first common XPath ancestor in Javascript?) Cependant, ils parlent de plus long ancêtre commun. Je l'écris en Javascript sous la forme d'une extension firefox.
Merci pour votre temps et toute aide serait grandement appréciée!
Il n'est pas clair quel est le problème. Vous n'avez pas défini les "mauvaises" expressions XPath et les "bonnes" expressions Xpath. De plus, vous n'avez pas défini ce qui doit être fait si une "mauvaise" expression est entrée. S'il vous plaît, éditez votre question et définissez avec soin et aussi précisément que possible le problème. –
Hi Dimitre, en utilisant l'exemple ci-dessus, supposons qu'un utilisateur veuille extraire tous les liens de la section spotlight de google news, il peut donner quelques exemples de xpaths qui pointent les liens 'spotlight'.supposons qu'il ait accidentellement donné un «mauvais» exemple - un xpath aléatoire vers un autre contenu, le système ne devrait pas tomber dans le piège et essayer de le généraliser de sorte qu'il couvre le «mauvais» xpath. – netvarun
@ user649851: Il semblerait que vous souhaitiez l'ancêtre le plus proche, presque commun, avec plus de descendants d'un ensemble de nœuds donné. Lorsque les nœuds du jeu de nœuds proviennent du même document, ils ont au moins un ancêtre commun: l'élément racine dans le pire des cas. Donc, si vous voulez le plus profond, cela signifie que vous devez comparer le Deph contre cet ancêtre sûrement commun. En outre, parce que vous voulez que le commun que vous avez à choisir quel noeud du jeu de nœud vous ne considérerez pas. Ce processus rend cette tâche impossible pour une seule expression XPath, je pense. –