2017-12-21 3 views
1

<br>,<br/>を新しい行として表示すると、xpath normalize-space()をhtmlで呼び出すことはできますか? XPathバージョンは1.0です要素の文字列値を選択するのにXPathを使用しますが、<br/>を改行に置き換えますか?

ウェブサイトの記事を解析します。実際の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>が含まれています。その結果、長いテキスト行が1つあります。私は休憩とテキスト行が必要です。

期待される結果:

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

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

1)「normalize-space()」を使用する特別な理由はありますか? 2)それらの2つの部分文字列を1つの文字列または2つの文字列のリストとして取得したいですか? 3)あなたのXPathを共有する – Andersson

+0

@Andersson 1)HTMLタグを持たず、ブレークポイントを持つテキストが必要です。 2)我々は1から∞
タグを持つことができます。私たちは記事をクロールします。 –

+0

あなたは混合コンテンツの中で唯一の要素タイプが 'br'ですか? – kjhughes

答えて

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

は、改行を持つすべてのbrの要素を置き換える、対象divのすべてのテキストノードの子孫の列に参加します。

+0

xpathバージョンを確認しました.1.0です。 xpath 1.0でも同じことが可能ですか?とにかく、あなたの応答のためにありがとう –

+0

私は答えたとき、質問はXPath 2.0とタグ付けされました。 (それ以降編集されています) – kjhughes

+1

XPath 1.0だけでは、純粋にXPathベースのソリューションを見つけることができないと思われます。これは、ホスティング言語でコードを記述する必要があります。 – kjhughes

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() 
関連する問題