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