规范化空间不足以呈现错误呈现的内容

时间:2018-02-26 16:04:00

标签: python scrapy

我正在寻找this page的“描述”部分。它包含多个<p>标记。我可以使用此xpath

检索它们
response.xpath('//div[@itemprop="description"]/p/text()').extract()

但结果是列表的形式,这不符合我的期望:

['\r\n\tLancée en 2016, la start-up ',
 'est spécialisée dans le développement de ',
 " permettant l'",
 " et l'amélioration de sa prise en charge.",
 '\r\n\t',
 '\r\n\tLa jeune pousse développe ',
 ', un dossier médical numérique universel regroupant toutes les ',
 ' (antécédents, allergies, contre-indications, ordonnances, imagerie, biologie...).',
 '\r\n\t\xa0',
 '\r\n\tLes solutions développées par InnovSanté permettent de faciliter le parcours de soins, de connecter les différents intervenants de la santé et de générer des économies de santé publique.\xa0']

我想使用以下内容添加normalize-space的functionnality来检索'干净数据':

response.xpath('normalize-space(//div[@itemprop="description"]/p/text())').extract()

但是,结果仅限于上一个列表的第一个<p>标记:

['Lancée en 2016, la start-up']

1 个答案:

答案 0 :(得分:0)

如果您想在strong标记内获取文字,则需要将xpath表达式修改为//div[@itemprop="description"]/p//text()
/匹配xpath中的直接子项,而//匹配任何后代。

有关进行空间规范化的方法,请查看gangabass的答案。

在scrapy中处理此问题的另一种方法是使用具有适当输入和/或输出处理器的item loader
例如,使用MapCompose(str.strip)作为输入处理器并使用Join()作为输出处理器会产生以下结果:

{'description': 'Lancée en 2016, la start-up InnovSanté est spécialisée dans '
                "le développement de solutions de e-santé permettant l' "
                'optimisation du parcours de soins du patient et '
                "l'amélioration de sa prise en charge.  La jeune pousse "
                'développe Passeport Vital , un dossier médical numérique '
                'universel regroupant toutes les informations relatives au '
                'malade (antécédents, allergies, contre-indications, '
                'ordonnances, imagerie, biologie...).  Les solutions '
                'développées par InnovSanté permettent de faciliter le '
                'parcours de soins, de connecter les différents intervenants '
                'de la santé et de générer des économies de santé publique.'}