Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scrapy get all children / ignore <br>?

I have this piece of html and I want to extract all text in one element with scrapy.

<td class="infoOffre">Rue de Trazegnies 41<br>6031&nbsp;
      Monceau sur Sambre<br>BELGIQUE</td>

When I use xpath('.//td//text()').extract() I get 3 elements instead

like image 232
dkx22 Avatar asked Jun 26 '15 10:06

dkx22


2 Answers

You may want to remove /text() from your XPath, and then get rid of <td> and <br> tags later.

selector = scrapy.Selector(text='<td class="infoOffre">Rue de Trazegnies 41<br>6031&nbsp;Monceau sur Sambre<br>BELGIQUE</td>')
>>> selector.xpath('.//td//text()').extract()
['Rue de Trazegnies 41', '6031\xa0Monceau sur Sambre', 'BELGIQUE']
>>> selector.xpath('.//td').extract()
['<td class="infoOffre">Rue de Trazegnies 41<br>6031\xa0Monceau sur Sambre<br>BELGIQUE</td>']

Second option is to replace <br> by /n. Below I used Python 3, therefore unicode is converted into bytes.

response = response.replace(body=response.body.replace(b'<br>', b'\n'))
like image 55
klapshin Avatar answered Sep 22 '22 21:09

klapshin


You probably want XPath string() function:

>>> import scrapy
>>> selector = scrapy.Selector(text="""<td class="infoOffre">Rue de Trazegnies 41<br>6031&nbsp;
...       Monceau sur Sambre<br>BELGIQUE</td>""")
>>> selector.xpath('.//td//text()').extract()
[u'Rue de Trazegnies 41', u'6031\xa0\n      Monceau sur Sambre', u'BELGIQUE']
>>> selector.xpath('string(.//td)').extract()
[u'Rue de Trazegnies 416031\xa0\n      Monceau sur SambreBELGIQUE']
>>> 

or you can join() each text node:

>>> " ".join(selector.xpath('.//td//text()').extract())
u'Rue de Trazegnies 41 6031\xa0\n      Monceau sur Sambre BELGIQUE'
>>> 

Edit after OP's comment:

string() indeed only works on the first node in a node set, so either you have a more selective XPath to have the correct node (using [3] position predicates), or you look on elements, and apply string(.) on each.

For your specific example, you can use something like this:

(scrapy10)paul@paul$ scrapy shell "https://www.leforem.be/HotJob/servlet/JobOffs.View?id=20729863&nextUrl="
>>> for t in response.xpath('.//table[@class="visualOffre"]'):
...     print t.xpath('string(.)').extract()
... 
[u"Nombre de postes demand\xe9s\xa0: 1Cat\xe9gorie de m\xe9tier\xa0:Soudeur\xa0\n              (4413201)\n              [PERSONNEL DE LA CONSTRUCTION MECANIQUE ET DU TRAVAIL DES METAUX]Secteur d'activit\xe9\xa0:Fabrication d'autres machines d'usage sp\xe9cifiqueLieu(x) de travail\xa0:CHARLEROI [ARRONDISSEMENT](CHARLEROI [ARRONDISSEMENT])\n          Votre fonction\xa0:Une soci\xe9t\xe9 du Grand Charleroi recherche un monteur soudeur. \uf02d\tLire et interpr\xe9ter des plans, effectuer un tra\xe7age,\uf02d\tD\xe9couper des pi\xe8ces m\xe9talliques\uf02d\tUsiner les diff\xe9rentes pi\xe8ces entrantes dans les ouvrages.\uf02d\tMettre en forme des pi\xe8ces m\xe9talliques. Assembler les pi\xe8ces et raccorder ( semi et arc). .\uf02d\tMettre en couleur\uf02d\tContr\xf4ler la conformit\xe9 par rapport aux sp\xe9cifications techniques.\uf02d\tMonter les structures fabriqu\xe9es (escaliers, portails, garde-fous, + constructions b\xe2timents industriels\uf02d\t R\xe9aliser des travaux d'ajustage, de montage et d'assemblage (forage, taraudage, filetage, soudage)."]
[u"Exp\xe9rience(s) professionnelle(s)\xa0:M\xe9tier\xa0:Dur\xe9e\xa0:Secteur\xa0:Description\xa0:Soudeur\n\t     \xa0\n      \n          \t\tSans importance\n          \t\xa0\n      Fabrication d'autres machines d'usage sp\xe9cifique\xa0\n      \uf02d\tVous poss\xe9dez de l'exp\xe9rience comme soudeur (semi-) et comme monteurPermis de conduire\xa0:Permis de conduireDescription[B] V\xe9hicules < 3,5 tonnes et 8 places maximumd\xe9placements possiblesQualification(s)\xa0:QualificationDescription\xa0Brevet  VCA de base--Commentaire (qualifications)\xa0:\uf02dDescription libre\xa0:Vous aimez et vous savez travailler en \xe9quipe\uf02d\tVous travaillez en atelier\uf02d\tVous supportez la chaleur et les intemp\xe9ries (pas de ch\xf4mage intemp\xe9ries)\uf02d\uf02d\tEtre minutieux, pr\xe9cis et soucieux du travail bien fait"]
[u'R\xe9gime de travail\xa0:Temps plein de jourHoraire\xa0:du  lundi au jeudi de 7h \xe0 15h45 et le vendredi de 7h \xe0 14hCommentaire additionnel\xa0:ou PFI en fonction du profilType\xa0:A dur\xe9e d\xe9termin\xe9eSalaire\xa0:Selon la CP 111 - 11,890EUR brut/h']
[u"\n      Modalit\xe9s de candidature :Si vous correspondez aux crit\xe8res, faites nous parvenir votre cv et votre lettre de motivation \xe0 [email protected] (ou par courrier ou par fax au 071/30.08.23)Nom de l'entreprise\xa0:MIRECNom de la personne\xa0:M.\xa0Gauthier Mulatin (Responsable de projets)Adresse\xa0:Rue de Trazegnies 416031\xa0\n      Monceau sur SambreBELGIQUEE-mail\xa0:[email protected]\xa0:www.mirec.net"]
>>> 
like image 38
paul trmbrth Avatar answered Sep 20 '22 21:09

paul trmbrth