让我说我有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
文本。
答案 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