Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy和XPath的一般选择_Python_Xpath_Scrapy - Fatal编程技术网

Python Scrapy和XPath的一般选择

Python Scrapy和XPath的一般选择,python,xpath,scrapy,Python,Xpath,Scrapy,我刚开始学习Scrapy,我自己学习了一些示例并编写了一个spider,但现在我在选择文本数据时遇到了一个问题。例如,如果表格单元格中的文本不总是唯一的格式,我如何仅选择文本: <table> <tr> <td> <div id="somediv1"> <span>blablabla</span> </div> </td>

我刚开始学习
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>

喋喋不休
文本2
文本3
文本4
因此,单元格中的文本将嵌套在未知标记中,我当然只想提取没有任何标记的干净文本。

使用

//table//td//text()[normalize-space()]
<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>
blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   
blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   
这将选择作为XML文档
元素的后代的
td
的后代的任何非全空白文本节点

基于XSLT的验证

//table//td//text()[normalize-space()]
<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>
blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   
blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   
更新

//table//td//text()[normalize-space()]
<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>
blablabla
=============   
     text2
=============   
     text3
=============   
     text4
=============   
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>

类似于“//text()”的XPath?嗯,text()返回空列表,这可能是因为所有内容都在div或span中,甚至
//text()
返回空列表?是的,//text()返回包含div和spansStrange的元素的空列表-给定上面的示例-我得到了18个匹配-然后经过稍微细化,使用
tree.xpath('//text()[normalize-space()]')
,我得到
['blablablabla',text2',text3',text4']