HTML XPath: Extraire du texte mélangé avec plusieurs balises?
Objectif: Extraire le texte à partir d'un élément particulier (par exemple, li), tout en ignorant les différents mélangés dans les tags, c'est à dire aplatir les enfants de premier niveau et il suffit de retourner la concaténation de texte de chaque aplatie enfant séparément.
Exemple:
<div id="mw-content-text"><h2><span class="mw-headline" >CIA</span></h2>
<ol>
<li>Central <a href="/Intelligence_Agency.html">Intelligence Agency</a>.</li>
<li>Culinary <a href="/Institute.html">Institute</a> of <a href="/America.html">America</a>.</li>
</ol>
</Div>
texte:
- Agence Centrale De Renseignement
- Institut culinaire de l'Amérique
Sauf que le point d'ancrage des balises entourant empêcher une simple récupération.
À revenir chaque balise li séparément, nous utilisons le simple:
//div[contains(@id,"mw-content-text")]/ol/li
mais qui comprend également l'entourant d'ancrage des balises, etc. Et
//div[contains(@id,"mw-content-text")]/ol/li/text()
renvoie uniquement les éléments de texte qui sont les enfants directs de li, c'est à dire 'Central','.'...
Il semble logique alors de chercher des éléments de texte de soi et de descendants
//div[contains(@id,"mw-content-text")]/ol/li[descendant-or-self::text]
mais qui ne retourne rien du tout!
Des suggestions? Je suis à l'aide de Python, donc je suis ouvert à l'utilisation d'autres modules de post-traitement.
(Je suis en utilisant le Scrapy HtmlXPathSelector qui semble XPath 1.0 conforme)
source d'informationauteur ChaimKut
Vous devez vous connecter pour publier un commentaire.
Vous avez été près de là. Il y a un petit problème dans:
De la correction de l'expression est:
Cependant, il est plus simple expression qui produit exactement le voulait la concaténation de tous les textes-nœuds sous le spécifiée
li
:Je pense que la suivante serait de retour le résultat correct:
Remarque la double barre oblique avant le texte(). Cela signifie que les nœuds de texte sur n'importe quel niveau en dessous de li doit être retourné.
La concaténation de chaîne est délicate. Voici une solution rapide à l'aide de
lxml
:Veuillez noter que
//
a potentiellement mauvaise performance /exécution involontaire et doit être évitée autant que possible, mais difficile de le faire avec l'exemple de fragment HTML.