XPath选择元素的字符串值,但用换成换行符?

时间:2017-12-21 19:25:53

标签: python xpath scrapy scrapy-spider xpath-1.0

是否可以在html上调用xpath normalize-space()并显示<br><br/>作为新行? XPath版本是1.0

我们解析网站上的文章。真实HTML代码的示例:

<div id="someid">
    <img src="https://habrastorage.org/webt/ej/ye/hp/ejyehp08ercmqzlhzh3um6mtukm.jpeg"><br>
    <br>
    Организовать удаленный доступ для сотрудников — задача прикладная. Решений на рынке немало, при этом, и подводных камней достаточно. Под катом рассказ о нашем «чемодане», который раскладывается быстро и удобно за 30 минут. Просьба не воспринимать это как рекламный BS, поскольку внутри реальная инструкция по применению.<a name="habracut"></a><br>
    <br>
    <a href="https://www.parallels.com/ru/products/ras/remote-application-server/">Parallels Remote Application Server</a> (RAS) — это комплексное средство для доставки виртуальных приложений и рабочих столов, позволяющее работать с приложениями и данными с любого устройства, в том числе мобильного. Мы понимаем, что такие решения хочется сначала протестировать в конкретных условиях, прежде чем принимать решение о покупке.     <br>
    <br>
</div>

问题不在于从网站中提取文本。问题是normalize-space删除所有标记包括<br>。因此,我们有一个长文本行。我需要带有休息的文字行。

预期结果:

Организовать удаленный доступ для сотрудников — задача прикладная. Решений на рынке немало, при этом, и подводных камней достаточно. Под катом рассказ о нашем «чемодане», который раскладывается быстро и удобно за 30 минут. Просьба не воспринимать это как рекламный BS, поскольку внутри реальная инструкция по применению.

Parallels Remote Application Server(RAS) — это комплексное средство для доставки виртуальных приложений и рабочих столов, позволяющее работать с приложениями и данными с любого устройства, в том числе мобильного. Мы понимаем, что такие решения хочется сначала протестировать в конкретных условиях, прежде чем принимать решение о покупке.

2 个答案:

答案 0 :(得分:1)

此XPath 2.0表达式,

string-join(
for $n in (//div[@id="someid"]//node()[self::br or self::text()]) 
    return if (name($n)='br') 
           then codepoints-to-string(10)
           else $n, '')

将加入目标div的所有文本节点后代的字符串,并用换行符替换所有br元素。

答案 1 :(得分:0)

不幸的是,我没有用xpath解决这个问题。这个解决方案适用于python(scrapy框架),但算法也适用于其他语言。

parsed_text = remove_tags(response.xpath(record['xpath_text']).extract_first())
text = re.sub(r'\n\s*\n', '\n\n' , parsed_text).strip()