python - Scrapy 获取所有子项/忽略 <br>?

标签 python python-2.7 web-scraping web-crawler scrapy

我有这段 html,我想用 scrapy 提取一个元素中的所有文本。

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

当我使用 xpath('.//td//text()').extract() 时,我得到了 3 个元素

最佳答案

您可能需要 XPath string() 函数:

>>> 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']
>>> 

或者您可以join()每个文本节点:

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

在OP评论后编辑:

string() 实际上只适用于节点集中的第一个节点,所以要么你有一个更具选择性的 XPath 来获得正确的节点(使用 [3]位置谓词),或者您查看元素,然后在每个元素上应用 string(.)

对于您的具体示例,您可以使用如下内容:

(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 pascal.noel@mirec.net (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:pascal.noel@mirec.netURL\xa0:www.mirec.net"]
>>> 

关于python - Scrapy 获取所有子项/忽略 <br>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31070660/

相关文章:

python - 集群上数据的Dask和持久化

python - 相空间中的轨迹 - 溢出错误 : (34, 'Result too large' )

python - Numpy 数组改变 id

python - NLTK 每个词最常见的同义词(Wordnet)

python - 多个 numpy 数组的矩阵乘法

Python 数值积分与辛普森规则

python - 如果当前值大于现有最小值,则更新 mysql 中的表,否则忽略该更新

javascript - 如何通过 Beautiful Soup 抓取 href 中的文本?

python - Twitter抓取重复执行代码(python)

python - 使用 Python 抓取和解析 Google 搜索结果