2

から始めたばかりでScrapy、いくつかの例を見てspider、自分で を書きましたが、今では一般的にテキスト データを選択する際に問題があります。フォーマット:

<table>
 <tr>
    <td>
        <div id="somediv1">
              <span>blablabla</span>
         </div>
    </td>
    <td>
        <div id="somediv2">
              <span>text2</span>
         </div>
          <div id="somediv3">
              <span>text3</span>
         </div>

         <span>text4</span>
    </td>
 </tr>
</table>

したがって、セル内のテキストは不明なタグ内にネストされます。もちろん、タグなしでクリーンなテキストを抽出したいと思います。

4

1 に答える 1

1

使用:

//table//td//text()[normalize-space()]

これにより、XML ドキュメントtdの要素の子孫である の子孫であるすべてが空白ではないテキスト ノードが選択されます。table

XSLT ベースの検証:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:for-each select="//table//td//text()[normalize-space()]">
       <xsl:copy-of select="."/>
=============   
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

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

<table>
    <tr>
        <td>
            <div id="somediv1">
                <span>blablabla</span>
            </div>
        </td>
        <td>
            <div id="somediv2">
                <span>text2</span>
            </div>
            <div id="somediv3">
                <span>text3</span>
            </div>
            <span>text4</span>
        </td>
    </tr>
</table>

XPath 式が評価され、視覚的に特徴的な区切り文字列を使用して、選択されたすべてのテキスト ノードが出力にコピーされます

blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   

更新

ソース XML ドキュメントがデフォルトの名前空間にある場合、上記の XPath 式は、この事実を考慮して変更する必要があります。

//x:table//x:td//text()[normalize-space()

ここで、プレフィックス"x"はソース XML ドキュメントのデフォルトの名前空間にバインドされます。

XSLT ベースの完全な例を次に示します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:for-each select="//x:table//x:td//text()[normalize-space()]">
       <xsl:copy-of select="."/>
=============   
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメント(提供されたものですが、既定の (XHTML) 名前空間に配置されている) に適用される場合:

<table xmlns="http://www.w3.org/1999/xhtml">
    <tr>
        <td>
            <div id="somediv1">
                <span>blablabla</span>
            </div>
        </td>
        <td>
            <div id="somediv2">
                <span>text2</span>
            </div>
            <div id="somediv3">
                <span>text3</span>
            </div>
            <span>text4</span>
        </td>
    </tr>
</table>

再び同じ正しい結果が生成されます。

blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   
于 2012-10-16T16:54:16.530 に答える