5

contains を使用して要素の text() でデータの存在を検索すると、プレーン データでは機能しますが、要素のコンテンツに改行や改行/タグがある場合は機能しません。//td[contains(text(), "")]この場合、どのように機能させるのですか?ありがとうございました!

XML :

<table>
  <tr>
    <td>
      Hello world <i> how are you? </i>
      Have a wonderful day.
      Good bye!
    </td>
  </tr>
  <tr>
    <td>
      Hello NJ <i>, how are you?
      Have a wonderful day.</i>
    </td>
  </tr>
</table>

パイソン:

>>> tdout=open('tdmultiplelines.htm', 'r')
>>> tdouthtml=lh.parse(tdout)
>>> tdout.close()
>>> tdouthtml
<lxml.etree._ElementTree object at 0x2aaae0024368>
>>> tdouthtml.xpath('//td/text()')
['\n      Hello world ', '\n      Have a wonderful day.\n      Good bye!\n    ', '\n      Hello NJ ', '\n    ']
>>> tdouthtml.xpath('//td[contains(text(),"Good bye")]')
[]  ##-> But *Good bye* is already in the `td` contents, though as a list.
>>> tdouthtml.xpath('//td[text() = "\n      Hello world "]')
[<Element td at 0x2aaae005c410>]
4

2 に答える 2

9

使用:

//td[text()[contains(.,'Good bye')]]

説明:

この問題の理由は、テキスト ノードの文字列値が複数行の文字列であることではありません。本当の理由は、td要素に複数のテキスト ノードの子があることです。

提供された式では

//td[contains(text(),"Good bye")]

関数に渡される最初の引数contains()は、複数のテキスト ノードのノード セットです

XPath 1.0 仕様 (XPath 2.0 では、これは単純に型エラーを引き起こします) に従って、文字列引数を期待しているが、代わりにノード セットが渡された関数の評価は、ノード内の最初のノードの文字列値のみを取ります。セット

この特定のケースでは、渡された node-set の最初のテキスト ノードに文字列 value があります

 "
                 Hello world "

そのため、比較は失敗し、必要tdな要素は選択されていません

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="//td[text()[contains(.,'Good bye')]]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<table>
      <tr>
        <td>
          Hello world <i> how are you? </i>
          Have a wonderful day.
          Good bye!
        </td>
      </tr>
      <tr>
        <td>
          Hello NJ <i>, how are you?
          Have a wonderful day.</i>
        </td>
      </tr>
</table>

XPath 式が評価され、選択されたノード (この場合は 1 つだけ) が出力にコピーされます

<td>
          Hello world <i> how are you? </i>
          Have a wonderful day.
          Good bye!
        </td>
于 2012-06-20T03:45:15.997 に答える
3

.の代わりに使用text():

tdouthtml.xpath('//td[contains(.,"Good bye")]')
于 2012-06-19T20:56:46.533 に答える