0

我正在使用 PHP QueryPath 库从一组旧的 HTML 文件中提取数据,并且在大多数情况下,我一直在使用通过 find() 函数提供的 CSS 选择器来提取数据。但是,并非所有包含我需要提取的数据的元素都有唯一的 CSS 标识符,因此我一直在使用 Regexp 和 QueryPath 的丑陋组合来提取数据。

<ul class="list><li>Data1</li><li>Data2</li></ul>

例如,我将如何从该列表元素中干净地提取“Data2”?是否有一个 QueryPath 函数可以让我指定,例如,父元素的第二个子元素作为要检索的元素?

4

2 回答 2

3

实际上有几种方法可以做到这一点。最简单的是使用 CSS 3 pseduclass :nth-of-type()。这会直接在 UL 内部获得第二个 LI:

qp($html, 'ul>li:nth-of-type(2)');

:nth-of-type和其他 CSS 3 选择器采用所谓的“an+b”规则,您可以在其中说出有多少项目组成一个组,然后说出您想要的组中的哪个项目。例如,tr:nth-of-type(4n+2)将表格行分成 4 组,然后返回每组中的第二个元素。:evenand:odd只是2nand的简写2n+1

其他可能值得研究的 CSS:

  • ':第'
  • ':first-of-type', ':first'
  • ':last-of-type', ':last'
  • ':偶数', ':奇数'
  • ':not()'、':has()' 和 ':contains()'

您还可以获取所有 LI 元素,然后只获取第二个:

qp($html, 'li')->eq(2);

或者,正如之前的海报所指出的,您可以DOMNode使用以下方法获取第二个对象的实际对象get()

qp($html, 'li')->get(2);

如果您有非常复杂的需求,您可以使用filter()获取列表,并通过自定义函数运行它。

于 2012-05-23T13:32:05.907 回答
1

要获得第 n 个匹配的对象,您可以使用QueryPath::get(n-1).

于 2011-03-24T03:06:16.123 回答