Xpath规范化空间

时间:2012-10-18 22:55:42

标签: python xpath lxml

我感到愚蠢。 Python& xpath新手在这里。我正在尝试使用

中的xpath提取完整的文本'Open Box Price: $1079.99'
<div class="prod-price">
<p class="opbox-price">
    <strong> Open Box Price:<br>$1079.99</strong>
    </p>
<p class="orig-price">
    Regular Price: <strong>$1499.98</strong>
    </p>
</div>

但我不能。文字在<br>处停止。这是我的代码

doc = lxml.html.fromstring(r.content)
elements = doc.xpath(item_xpath)
print elements[1].find('div[3]/p[1]/text()[normalize-space()]')

2 个答案:

答案 0 :(得分:4)

您想要的XPath的基础是使用descendant-or-self - 根据需要调整结果:

>>> doc.xpath('//p[1]/descendant-or-self::text()')
['\n    ', ' Open Box Price:', '$1079.99', '\n    ']
>>> doc.xpath('//p[2]/descendant-or-self::text()')
['\n    Regular Price: ', '$1499.98', '\n    ']

或者当您使用lxml.html时,您可以使用text_content()

paras = doc.xpath('//p'): # or findall etc...
for para in paras:
    print para.text_content()

答案 1 :(得分:1)

只需使用,假设初始上下文(当前节点)是div的父级:

normalize-space(div/p[1]/strong)

基于XSLT的验证

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

 <xsl:template match="/*">
     "<xsl:value-of select="normalize-space(div/p[1]/strong)"/>"
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档(提供的文档已更正为格式良好,然后包含在顶部html元素中):

<html>
    <div class="prod-price">
        <p class="opbox-price">
          <strong> Open Box Price:<br />$1079.99</strong>
        </p>
        <p class="orig-price">
    Regular Price: 
            <strong>$1499.98</strong>
        </p>
    </div>
</html>

XPath表达式从顶部元素(html)开始计算,评估结果被复制(用引号括起)到输出

"Open Box Price:$1079.99"