2011-03-24 97 views
0

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

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

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

回答

3

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

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

:nth-of-type等CSS 3个选择采取所谓的“一+ B”的规则,在那里你可以说有多少项目组成一组,然后说哪个项目来自你想要的组。例如,tr:nth-of-type(4n+2)会将表格行拆分为4个组,然后返回每个组中的第二个元素。 :even:odd只是2n2n+1的简写。

其他CSS这可能是值得探讨:

  • ':第n个'
  • ':第一型', ':第一个'
  • ':最后的类型' ':去年'
  • ':即使', ':奇'
  • ':不是()', ':有()' 和 ':包括()'

你也可以得到所有的li元素,然后得到的只是第二个:

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

,或作为以前的海报指出,就可以得到实际DOMNode对象使用get()第二个:

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

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