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
3 Réponses :
scrapy.Selector(text=example).xpath('//*[@class="ParamText"]/span/text()').extract()[1]
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.
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>
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 $
).
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.