2011-03-08 6 views
4

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!

+0

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. –

+0

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

+0

@ 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. –

Répondre

1

La question ici est dans le problème de minimisation Automaton. Donc vous avez (Xpath1 | Xpath2 | Xpath3) et vous aimeriez avoir un automate minimal Xpath4 qui correspond aux mêmes nœuds. Il y a aussi la question de la minimisation avec l'information perdue ou non, comme JPEG. Pour une minimisation exacte, vous pouvez google "Algorithmes pour la minimisation des automates à états finis". Ok, la manière la plus simple est de trouver une sous-séquence commune, après avoir converti chaque opérateur Xpath en caractère et exécuter un finder de sous-chaîne à base de caractères à partir de la liste de chaînes. Nous avons donc par exemple

adcba, acba, adba --common sous-chaîne -> aba --général reg exp -> a. * B. * A --convertir retour à xpath -> ...

Vous pouvez également essayer de définir quelque chose de moins général à la place de. *

Questions connexes