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后代的 a 的后代的任何非全空白文本节点。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 回答