如果两者都存在,则XPath选择一个

时间:2018-04-17 01:58:56

标签: html xpath web-scraping scrapy

我有类似

的东西
class ViewController: UIViewController {
    private let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "mm:ss:SS"
        return formatter
    }()

    @objc func updateElapsedTimeLabel (timer : Timer) {
        if watch.isRunning {
            elapsedTimeLabel.text = formatter.string(from: Date(timeIntervalSince1970: watch.elapsedTime))
        } else {
            timer.invalidate()
        }
    }
}

某些项目可能没有<li class="ProductPrice"> <span class="Regular Price">80.00</span> <span class="Sale Price">50.00</span> </li> <li class="ProductPrice"> <span class="Regular Price">100.00</span> </li> 范围。

我想提取当前的零售价格,我会选择Sale Price,或者如果Sale和Sale Price都存在,请仅选择Regular Price

我是XPath的新手,所以我不确定这个if-else是如何翻译的。

3 个答案:

答案 0 :(得分:1)

  

我想提取当前的零售价格,我会选择   销售价格或如果存在销售和常规价格,请选择销售   仅限价格。

如果您知道促销价格总是在正常价格之后,请使用XPath表达式

span[@class = 'Regular Price' or @class = 'Sale Price'][last()]

在XPath 2.0中,即使您不知道订单,也可以使用此方法:

(span[@class = 'Sale Price'], span[@class = 'Regular Price'])[1]

答案 1 :(得分:0)

XSLT-1.0解决方案有点复杂:

<xsl:template match="li">
    <xsl:choose>
        <xsl:when test="span/@class='Sale Price'">
            <xsl:value-of select="span[@class='Sale Price']" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="span[@class='Regular Price']" />            
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

因此,如果您有XPath-2.0或更高版本,则可以使用以下内容:

<xsl:template match="li">
    <xsl:value-of select="if (span/@class='Sale Price') then (span[@class='Sale Price']) else (span[@class='Regular Price'])" />            
</xsl:template>

两种解决方案的输出相同:

<?xml version="1.0" encoding="UTF-8"?>
50.00
100.00

逻辑并不完全符合您的要求,但它已接近。

答案 2 :(得分:0)

您可以在python中使用 lxml 模块。到目前为止,是我使用过的最简单的模块。

from lxml import html

data = '''<li class="ProductPrice">
              <span class="Regular Price">80.00</span>
              <span class="Sale Price">50.00</span>
          </li>
          <li class="ProductPrice">
              <span class="Regular Price">100.00</span>
          </li>
       '''

#make the html object
tree = html.fromstring(data)
li = tree.xpath('//li') #get all the li tags

for i in li:

    sp = i.xpath('.//span[contains(@class,"Sale Price")]/text()')
    rp = i.xpath('.//span[contains(@class,"Regular Price")]/text()')

    if sp:
        print('Price is :',sp[0])
    else:
        print('Price is :',rp[0])

我所做的是,提取促销价并检查它是否存在。 如果它存在,那么程序将打印 else 程序将打印正常价格。

注意

  • 使用单独的元素时,请记得在xpath中加上(。)
  • xpath 的结果始终为列表

对于任何查询都会发表评论。