Xpath - 如果B为0则选择A,否则选择B.

时间:2014-05-07 13:15:31

标签: xpath

我试图从一个搜索结果页面收集一些信息,我之前遇到过这个逻辑问题,现在我正在寻求你的帮助。

基本上,有两种不同方式的信息表可以查看

<table>
<tr>
  <th>Bolig areal</th> (estate size)
  <td>0 m</td>
</tr>
<tr>
  <th>Grund areal</th> (ground size)
  <td>5000 m</td>
</tr>
</table>

<table>
<tr>
  <th>Bolig areal</th> (estate size)
  <td>123 m</td>
</tr>
<tr>
  <th>Grund areal</th> (ground size)
  <td>5000 m</td>
</tr>
</table>

我想获得&#39; bolig areal&#39;(地产规模)。但如果&#39; bolig areal&#39;是0米,然后采取Grund面积(地面大小)

我目前停留在Xpath表达式上,如:

//div[@class='description-element description-info shadow']//th[contains(.,'Grund areal') or contains(.,'Bolig areal')]/following-sibling::td/text()[not(contains(.,'0 m'))]

我同时选择<th>,选择以下<td>/text,其中文字为!= 0m。 选择地面区域。

如何添加&#34;如果&#39; Bolig areal&#39;不同于0米挑选&#39; Bolig areal&#39;否则使用&#39; Ground areal&#39;

溶液:

".//tr[th = 'Bolig areal' and td != '0 m' or th = 'Grund areal' and not(ancestor::table/tr[th = 'Bolig areal' and td != '0 m'])]/td/text()"

3 个答案:

答案 0 :(得分:4)

试试这个:

//tr[th = 'Bolig areal' and td != '0 m' or th = 'Grund areal' and not(ancestor::table/tr[th = 'Bolig areal' and td != '0 m'])]/td

如果第一个表达式th = 'Bolig areal' and td != '0 m'不是{p>},则选择具有th = 'Grund areal' tr tr 对于当前表格为true。从选定的 tr 中选择 td

答案 1 :(得分:2)

怎么样:

//table[tr[th="Bolig areal"][td != "0 m"]]/tr[th="Bolig areal"]/td/text()
|
//table[tr[th="Bolig areal"][td = "0 m"]]/tr[th="Grund areal"]/td/text()

这基本上是一个翻译:

  • 如果table包含“Bolig areal”th的行,其值(td)与“0 m”不同,请选择该值({{1} })
  • 或者(td/text()运算符),如果“Bolig areal”值为“0 m”,则从标题为“Grund areal”的行中选择值

您可以使用|代替contains(th, "Bolig areal")

使用lxml(libxml2)的示例Python会话:

th="Bolig areal"

答案 2 :(得分:0)

您想要第一个th未跟随0 m,然后提取第一个td

//th[(.='Bolig areal' and following-sibling::td!='0 m') or (.='Grund areal' and ../..//th[.='Bolig areal']/following-sibling::td='0 m')]/following-sibling::td[1]