Xpath布尔OR(相当于Python的A | B:如果非空则返回A,否则返回B)

时间:2019-12-28 15:40:09

标签: python xpath

让我说我有html:

<body>
  <div class="items">
    <span class="label">label1</span>
    <div class="value">value1</div>
  </div>

  <div class="items">
    <span class="label">label2</span>
    <div class="value">
      <a class="link">value2</a>
    </div>
  </div>

  <div class="items">
    <span class="label">label3</span>
    <div class="value">
      <a class="link">value3</a>
    </div>
  </div>

  <div class="items">
    <span class="label">label4</span>
    <div class="value">value4</div>
  </div>
</body>

我正在尝试从<a class="link"><div class=value>获取文本。

for result in response.xpath("//div[@class='items']"):
    label = result.xpath(".//span[@class='label']//text()").extract_first()
    # here Im trying use or operation to get 
    # a text if possible or div text
    value = result.xpath(".//a[@class='link']//text()"
                         "|.//div[@class='value']//text()").get()
    print(label, value)

结果:

label1 value1
label2 
label3 
label4 value4

尽管存在<div class='value'>,但是此代码仅分配来自<a class='link'>的文本。

我需要什么?
我希望xpath代码尽可能返回a文本,否则应返回div文本。

2 个答案:

答案 0 :(得分:1)

这是您应该使用的xpath。

System.Int32

因此将其替换为您的代码。

//div[@class='items'][2]//div[@class='value']/a|//div[@class='items'][2]//div[@class='value'][not(a)]

答案 1 :(得分:0)

  

我正在尝试从<a class="link"><div> class=value>那里获取文本

这是一个简单/简短的XPath 1.0表达式,可以精确选择所有需要的文本节点

(//div[@class='value'] | //a[@class='link'])/text()

基于XSLT 1.0的验证:

此转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:for-each select="(//div[@class='value'] | //a[@class='link'])/text()">
      <xsl:if test="not(position() = 1)">, </xsl:if>
      <xsl:copy-of select="."/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

计算XPath表达式,并使用方便的定界符输出每个选定的文本节点

产生了想要的结果

value1, value2, value3, value4
相关问题