XPath忽略跨度

时间:2012-06-10 12:15:48

标签: xpath

我有一个HTML,其中包含一些标签,如下所示:

<div id="SNT">text1</div>
<div id="SNT">text2</div>
<div id="SNT">textbase1<span style='color: #EFFFFF'>text3</span></div>
<div id="SNT">textbase2<span style='color: #EFFFFF'>text4</span></div>

如何使用XPath获取所有所有text标记中的<div>,忽略span字段?

即:

text1  
text2  
textbase1text3  
textbase2text4   

4 个答案:

答案 0 :(得分:2)

您可以使用:

//div/text()

div/text()

希望这有帮助。

答案 1 :(得分:1)

无法使用单个XPath 1.0表达式指定。

您需要先选择所有相关的div元素:

//div[@id='SNT']

然后为每个选定的节点获取其字符串节点

string(.)

在XPath 2.0中,可以使用单个表达式指定

//div[@id='SNT]/string(.)

基于XSLT的验证

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

 <xsl:template match="div[@id='SNT']">
     <xsl:copy-of select="string()"/>
========    
 </xsl:template>
</xsl:stylesheet>

当对以下XML文档应用此XSLT 1.0转换时(提供的XML片段,包含在单个顶部元素中):

<t>
    <div id="SNT">text1</div>
    <div id="SNT">text2</div>
    <div id="SNT">textbase1<span style='color: #EFFFFF'>text3</span></div>
    <div id="SNT">textbase2<span style='color: #EFFFFF'>text4</span></div>
</t>

选择(匹配)相关的div元素并由唯一指定的模板处理,其中评估string(.) XPath表达式并将其结果复制到输出中:

    text1
========    

    text2
========    

    textbase1text3
========    

    textbase2text4
========    

对于XPath 2.0表达式

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select="//div[@id='SNT']/string(.)"/>
 </xsl:template>
</xsl:stylesheet>

当对同一XML文档(上面)应用此XSLT 2.0转换时,将评估XPath 2.0表达式并将结果(四个字符串)复制到输出

text1 text2 textbase1text3 textbase2text4

答案 2 :(得分:1)

这是链接The lxml.etree Tutorial,然后搜索Using XPath to find text
例如:

from lxml import etree 
html = """
<span class='demo'>
Hi, 
<span>Tom</span>
</span>

tree = etree.HTML(html)
node = tree.xpath('//span[@class="demo"]')[0]
print(node.xpath('string()')

答案 3 :(得分:0)

如果HTML文件中没有其他内容,只有通常的HTML根元素中的那些<div>,则以下样式表就足以提取文本:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

</xsl:stylesheet>

如果您只需要<div>,并且只需要使用这些特定ID,请使用以下代码 - 它还可以确保换行符与您的示例类似:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

<xsl:template match="//div[@id='SNT']">
    <xsl:copy-of select="node()|text()"/><xsl:text>&#xA;</xsl:text>
</xsl:template>

</xsl:stylesheet>