2011-03-24 86 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()來獲取列表,並通過自定義函數運行它。