2017-12-21 10 views
1

Ist es möglich, Xpath normalize-space() auf HTML mit <br>, <br/> als neue Zeile aufrufen? XPath-Version ist 1.0XPath, um den String-Wert des Elements auszuwählen, aber mit <br/> ersetzt durch Newline?

Wir analysieren Artikel von Websites. Beispiel für echten HTML-Code:

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

Problem nicht beim Extrahieren von Text von der Website. Problem ist, dass normalize-space entfernen alle Tags sind <br>. Als Ergebnis haben wir eine lange Textzeile. Ich brauche eine Textzeile mit Pausen.

Erwartetes Ergebnis:

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

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

1) Gibt es einen bestimmten Grund, warum Sie 'normalize-space()' verwenden möchten? 2) Willst du diese 2 Teilstrings als einzelne Saite oder als Liste von 2 Saiten bekommen? 3) Teilen Sie Ihren XPath – Andersson

+0

@Andersson 1) Wir brauchen Text ohne HTML-Tags, aber mit Haltepunkten. 2) Wir können von 1 bis zu
Tags haben. Wir crawlen Artikel. –

+0

Sind Sie sicher, dass 'br' der einzige Elementtyp in Ihrem gemischten Inhalt ist? – kjhughes

Antwort

1

Dieser XPath 2.0-Ausdruck,

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, '') 

werden die Fäden aller Textknoten Nachkommen des anvisierten div und ersetzt alle br Elemente mit Zeilenumbrüchen kommen.

+0

Ich überprüfte Xpath-Version, und es ist 1.0. Ist es möglich, das Gleiche mit xpath 1.0 zu tun? Wie auch immer, danke für deine Antwort –

+0

Frage wurde als XPath 2.0 markiert, als ich antwortete. (Es ist seit bearbeitet worden.) – kjhughes

+1

Ich vermute, dass Sie mit nur XPath 1.0 nicht in der Lage sein werden, eine rein XPath-basierte Lösung zu finden - muss Code in der Hosting-Sprache schreiben. – kjhughes

0

Leider löse ich dieses Problem nicht mit Xpath. Diese Lösung eignet sich für Python (Scrapy Framework), aber der Algorithmus ist auch für andere Sprachen derselbe.

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