2012-10-16 80 views
2

我剛剛開始使用Scrapy,通過一些示例並自己編寫了一個spider,但現在我一般在選擇文本數據時遇到問題。例如,如何僅從中選擇文本如果它並不總是唯一的格式表格單元格:Scrapy和XPath一般選擇

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

因此,細胞內的文字將被嵌套未知的標籤內,我想只提取乾淨的文字當然沒有任何標籤。

+1

類似於「// text()」的XPath可能是什麼? –

+0

那麼,文本()返回空列表,這可能是因爲一切都在div或跨度 – Zed

+0

甚至'//text()'返回一個空列表? –

回答

1

使用

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

這將選擇任何非所有空白文本是一個td即XML文檔的一個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 
=============