使用QueryPath获取任意HTML元素的内容

时间:2011-03-24 03:01:36

标签: php html-parsing querypath

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

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

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

2 个答案:

答案 0 :(得分: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个组,然后返回每个组中的第二个元素。 :even:odd只是2n2n+1的简写。

可能值得研究的其他CSS:

  • ':第n个'
  • ':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()获取列表,并通过自定义函数运行它。

答案 1 :(得分:1)

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