1
votes

Scrapy Xpath avec text () égal à

    import scrapy
    example='<div class="ParamText"><span>OWNER APP</span></div>
<div class="ParamText"><span>OWNER</span></div>
<div class="ParamText"><span>OWNER NAME</span></div>'
    scrapy.Selector(text=example).xpath('//*[@class="ParamText"]/span[contains(text(),"OWNER")]').extract_first()
Here I need to scrape OWNER only sometimes 3 span I will get OWNERoutput:I am getting: OWNER APPI want: OWNER

0 commentaires

3 Réponses :


0
votes
scrapy.Selector(text=example).xpath('//*[@class="ParamText"]/span/text()').extract()[1]

1 commentaires

Vous pouvez le faire comme: scrapy.Selector (text = example) .xpath ('// * [@ class = "ParamText"] ‌ /span/text()').extra‌ ct_first (). Split ('') [0] Cela divisera la chaîne en un tableau et sélectionnera le premier élément.



0
votes

Vous pouvez sélectionner par équation de texte comme scrapy.Selector (text = txt) .xpath ('// * [@ class = "ParamText"] / span [text () = "OWNER"]'). get () ou sans détails de span, il vous donnera le premier: scrapy.Selector (text = txt) .css ('div.ParamText span'). get () < / p>


0 commentaires

1
votes

Vous pouvez utiliser l ' expression régulière ^ OWNER $ < / code> pour faire correspondre les intervalles contenant uniquement OWNER .

Remplacez contains (text (), "OWNER") par re: test (text ()," ^ OWNER $ ") .

L'avantage des expressions régulières est que vous pouvez également autoriser les espaces ( ^ \ s * OWNER \ s * $ ) ou prendre en charge différentes majuscules ( (? i) ^ OWNER $ ).


2 commentaires

Je crains que cela ne soit pas pris en charge dans la version actuelle de scrapy. Ils utilisent la version 1.0, pas 2.0 avec les expressions rationnelles.


J'ai lié la référence re: test à la documentation Scrapy. Scrapy inclut une extension XPath 1.0 qui ajoute la prise en charge des expressions régulières.