在 XPath 中使用 OR 运算符
Using OR operator in XPath
我在 XPath 表达式中使用 OR 运算符(不止一次)在遇到特定字符串之前在内容中提取我需要的内容,例如 'Reference,' 'For more information,' 等。这些术语中的任何一个都应该 return 相同的结果,但它们可能不是这个顺序。例如,'Reference' 可能不是第一个,也可能根本不在内容中,其中一个匹配项使用 table,'About the data.' 我希望所有内容都在这些字符串中的任何一个之前出现。
如有任何帮助,我们将不胜感激。
$expression =
"//p[
starts-with(normalize-space(), 'Reference') or
starts-with(normalize-space(), 'For more')
]/preceding-sibling::p";
这还需要考虑 table:
$expression =
"//article/table/tbody/tr/td[
starts-with(normalize-space(), 'About the data used')
]/preceding-sibling::p";
这是一个例子:
<root>
<main>
<article>
<p>
The stunning increase in homelessness announced in Los Angeles
this week — up 16% over last year citywide — was an almost an
incomprehensible conundrum.
</p>
<p>
"We cannot let a set of difficult numbers discourage us
or weaken our resolve" Garcetti said.
</p>
<p>
References
By Jeremy Herb, Caroline Kelly and Manu Raju, CNN
</p>
<p>
For more information: Maeve Reston, CNN
</p>
<p>Maeve Reston, CNN</p>
<table>
<tbody>
<tr>
<td>
<strong>About the data used</strong>
</td>
</tr>
<tr>
<td>From
</td>
<td>Washington, CNN</td>
</tr>
</tbody>
</table>
</article>
</main>
</root>
我正在寻找的结果如下。
<p>
The stunning increase in homelessness announced in Los Angeles
this week — up 16% over last year citywide — was an almost an
incomprehensible conundrum.
</p>
<p>
"We cannot let a set of difficult numbers discourage us
or weaken our resolve" Garcetti said.
</p>
I want all content before any one of these strings appears.
也就是说,您希望第一段之前的内容包含这些字符串之一。
包含这些字符串之一的段落是:
p[starts-with(normalize-space(), 'References') or starts-with(....)]
第一个这样的段落是
p[starts-with(normalize-space(), 'References') or starts-with(....)][1]
之前的段落是:
p[starts-with(normalize-space(), 'References') or starts-with(....)][1]
/preceding-sibling::p
在 2.0 中我可能会使用正则表达式:
p[matches(., '^\s*(References|For more information)')]
避免重复调用 normalize-space()。
我在 XPath 表达式中使用 OR 运算符(不止一次)在遇到特定字符串之前在内容中提取我需要的内容,例如 'Reference,' 'For more information,' 等。这些术语中的任何一个都应该 return 相同的结果,但它们可能不是这个顺序。例如,'Reference' 可能不是第一个,也可能根本不在内容中,其中一个匹配项使用 table,'About the data.' 我希望所有内容都在这些字符串中的任何一个之前出现。
如有任何帮助,我们将不胜感激。
$expression =
"//p[
starts-with(normalize-space(), 'Reference') or
starts-with(normalize-space(), 'For more')
]/preceding-sibling::p";
这还需要考虑 table:
$expression =
"//article/table/tbody/tr/td[
starts-with(normalize-space(), 'About the data used')
]/preceding-sibling::p";
这是一个例子:
<root>
<main>
<article>
<p>
The stunning increase in homelessness announced in Los Angeles
this week — up 16% over last year citywide — was an almost an
incomprehensible conundrum.
</p>
<p>
"We cannot let a set of difficult numbers discourage us
or weaken our resolve" Garcetti said.
</p>
<p>
References
By Jeremy Herb, Caroline Kelly and Manu Raju, CNN
</p>
<p>
For more information: Maeve Reston, CNN
</p>
<p>Maeve Reston, CNN</p>
<table>
<tbody>
<tr>
<td>
<strong>About the data used</strong>
</td>
</tr>
<tr>
<td>From
</td>
<td>Washington, CNN</td>
</tr>
</tbody>
</table>
</article>
</main>
</root>
我正在寻找的结果如下。
<p>
The stunning increase in homelessness announced in Los Angeles
this week — up 16% over last year citywide — was an almost an
incomprehensible conundrum.
</p>
<p>
"We cannot let a set of difficult numbers discourage us
or weaken our resolve" Garcetti said.
</p>
I want all content before any one of these strings appears.
也就是说,您希望第一段之前的内容包含这些字符串之一。
包含这些字符串之一的段落是:
p[starts-with(normalize-space(), 'References') or starts-with(....)]
第一个这样的段落是
p[starts-with(normalize-space(), 'References') or starts-with(....)][1]
之前的段落是:
p[starts-with(normalize-space(), 'References') or starts-with(....)][1]
/preceding-sibling::p
在 2.0 中我可能会使用正则表达式:
p[matches(., '^\s*(References|For more information)')]
避免重复调用 normalize-space()。