2017-10-03 1 views
1

Fondamentalement j'ai html semblable à ceci:Xpath, la sélection de texte de B à l'intérieur div tout en prenant du texte normal

<div> 
    <p> 
     <b>1</b> Communication 
    </p> 
    <p> 
     <b>2</b> Errors 
    </p> 
    ... 
</div> 

Ce que je suis en train (avec Scrapy) est quelque chose comme:

response.xpath("//div//p//text()") 

Cependant, cette renvoie une liste telle que

[ 
    "1", 
    "Communication", 
    "2", 
    "Errors"  
] 

Je veux avoir quelque chose comme:

[ 
    "1 Communication", 
    "2 Errors" 
] 

Toute aide ici serait grandement appréciée. J'essayais de trouver un moyen d'ignorer les balises b, mais je ne pouvais pas trouver quelque chose qui fonctionne réellement. La raison pour laquelle je ne peux pas simplement joindre les index de liste par deux est parce que pas chaque html que j'ai besoin d'analyser fonctionne comme ceci. Je veux utiliser quelque chose qui pourrait ignorer les balises b si elles existent, tout en obtenant le texte dans p dans tous les cas. Merci!

Répondre

0

Si votre motif général est d'ignorer les balises <b>, vous pouvez utiliser w3lib pour supprimer ces balises et construire une nouvelle réponse à partir du résultat. Quelque chose comme:

import w3lib 
import scrapy 

new_body = w3lib.html.remove_tags(response.body, which_ones=('b')) 
new_response = scrapy.http.HtmlResponse(url=response.url, body=new_body) 

new_response contient maintenant la réponse originale mais avec <b> balises supprimé. Vous pouvez ensuite utiliser la logique d'extraction sans avoir à les prendre en compte.

+0

C'est exactement ce à quoi je me suis tourné. Merci de le mentionner ici! –