16

基本的に、ネストされたタグを持つテキストをスクレイプする必要があります。

このようなもの:

<div id='theNode'>
This is an <span style="color:red">example</span> <b>bolded</b> text
</div>

そして、私はこれを生み出す表現が欲しいです:

This is an example bolded text

私はこれに1時間以上苦労してきましたが、結果はありませんでした。

どんな助けでも大歓迎です

4

5 に答える 5

26

要素ノードの文字列値は、要素ノードのすべてのテキストノードの子孫の文字列値をドキュメント順に連結したものです。

string()div要素でXPath関数を呼び出します。

string(//div[@id='theNode'])

スペースの正規化機能を使用して、ソースドキュメントの改行やインデントによって表示される可能性のある不要な空白を減らすこともできます。これにより、先頭と末尾の空白が削除され、空白文字のシーケンスが1つのスペースに置き換えられます。ノードセットをnormalize-space()に渡すと、ノードセットは最初にその文字列値に変換されます。normalize-spaceに引数が渡されない場合は、コンテキストノードが使用されます。

normalize-space(//div[@id='theNode'])

// if theNode was the context node, you could use this instead
normalize-space()

私が使用しているXPathの例よりも、コンテキストノードを選択するためのより効率的な方法を使用したい場合があります。たとえば、次のJavascriptの例は、一部のブラウザでこのページに対して実行できます。

var el = document.getElementById('question');
var result = document.evaluate('normalize-space()', el, null ).stringValue;

spanb要素の間の空白のみのテキストノードが問題になる可能性があります。

于 2012-05-03T02:13:07.580 に答える
2

Pythonでscrapyを使用している場合は、を使用できますdescendant-or-self::*/text()。完全な例:

txt = """<div id='theNode'>
This is an <span style="color:red">example</span> <b>bolded</b> text
</div>"""

selector = scrapy.Selector(text=txt, type="html") # Create HTML doc from HTML text
all_txt = selector.xpath('//div/descendant-or-self::*/text()').getall()
final_txt = ''.join( _ for _ in all_txt).strip()
print(final_txt) # 'This is an example bolded text'
于 2019-08-08T03:19:06.140 に答える
1

使用

string(//div[@id='theNode'])

この式が評価されると、結果はドキュメントの最初の(できれば唯一の)div要素の文字列値になります。

要素の文字列値は、XPath仕様で、そのすべてのテキストノードの子孫のドキュメント順序での連結として定義されているため、これはまさに必要な文字列です。

これには多数のすべて空白のテキストノードを含めることができるため、連続する先頭と末尾の空白を削除し、そのような中間の空白を単一の空白文字に置き換えることができます。

使用

normalize-space(string(//div[@id='theNode']))

XSLTベースの検証:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  "<xsl:copy-of select="string(//div[@id='theNode'])"/>"
===========
  "<xsl:copy-of select="normalize-space(string(//div[@id='theNode']))"/>"
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<div id='theNode'> This is an 
    <span style="color:red">example</span>
    <b>bolded</b> text 
</div>

2つのXPath式が評価され、これらの評価の結果が出力にコピーされます

  " This is an 
    example
    bolded text 
"
===========
  "This is an example bolded text"
于 2012-05-03T02:39:26.037 に答える
-1

これはどう :

/ div / text()[1] | / div / span / text()| / div / b / text()| / div / text()[2]

うーん、最後の部分はわかりませんが。あなたはそれで遊ぶ必要があるかもしれません。

于 2012-05-03T03:24:53.713 に答える
-1

通常のコード

// div [@ id ='theNode']

すべてのテキストを取得しますが、分割された場合は

// div [@ id ='theNode'] / text()

わかりませんが、リンクを教えていただければ試してみます

于 2020-03-28T19:28:33.097 に答える