3

我感觉很笨。Python & xpath 新手在这里。我正在尝试'Open Box Price: $1079.99'使用 xpath 从

<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()]')
4

2 回答 2

3

您想要使用的 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()
于 2012-10-18T23:07:29.873 回答
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"
于 2012-10-18T23:36:01.230 回答