2017-10-14 19 views
0

A partir des éléments HTML ci-dessous, comment puis-je choisir de conserver le texte hi there!! et de supprimer l'autre texte Cat à l'aide du sélecteur css? En outre, en utilisant .text ou .text.strip() je n'obtiens pas de résultats mais quand j'utilise .text_content() je reçois le texte.Conserver certains textes et supprimer le reste de certains éléments à l'aide du sélecteur

from lxml.html import fromstring 

html=""" 
<div id="item_type" data-attribute="item_type" class="ms-crm-Inline" aria-describe="item_type_c"> 
    <div> 
     <label for="item_type_outer" id="Type_outer"> 
      <div class="NotVisible">Cat</div> 
     Hi there!! 
      <div class="GradientMask"></div> 
     </label> 
    </div> 
</div> 
""" 
root = fromstring(html) 
for item in root.cssselect("#Type_outer"): 
    print(item.text) # doesn't work 
    print(item.text.strip()) # doesn't work 
    print(item.text_content()) # working one 

Résultat:

Cat 
Hi there!! 

Cependant, le résultat que je veux get est seulement hi there!! et que ce que j'ai essayé est:

root.cssselect("#Type_outer:not(.NotVisible)") #it doesn't work either 

Et encore une fois les questions suivantes:

  1. Pourquoi .text_content() est travail ing mais .text ou .text.strip() ne l'est pas?
  2. Comment puis-je obtenir seulement hi there!! en utilisant css selector?

Répondre

1

Dans le modèle d'arbre lxml, le texte que vous voulez obtenir est dans le tail de la div avec classe « NotVisible »:

>>> root = fromstring(html) 
>>> for item in root.cssselect("#Type_outer > div.NotVisible"): 
...  print(item.tail.strip()) 
... 
Hi there!! 

Donc, pour répondre à la première question, seul nœud texte qui n'est pas précédé de l'élément est dans la propriété text du parent. Le noeud de texte qui a un élément frère précédent, comme celui de cette question, sera dans la propriété tail de cet élément.

Une autre façon d'obtenir le texte "Hi there !!" est en interrogeant le nœud de texte non vide qui est l'enfant direct du label. La requête d'un tel niveau de détail peut être faite en utilisant l'expression XPath:

for item in root.cssselect("#Type_outer"): 
    print(item.xpath("text()[normalize-space()]")[0].strip()) 
+0

Pas moyen !!! Vous êtes si utile. Une dernière chose: pouvez-vous me dire pourquoi 'root.cssselect (" # Type_outer: not (.NotVisible) ")' il a échoué? Pardonne mon ignorance. Merci encore. – SIM

+1

Cette expression sélectionne * élément avec l'ID "Type_outer" qui n'a pas la classe "NotVisible" *, donc dans ce cas, il retourne fondamentalement le même élément que simplement # # Type_outer' puisque le label avec cet identifiant n'a pas non plus classe "NotVisible" – har07