Используйте QueryPath, чтобы получить содержимое произвольных элементов HTML - PullRequest
0 голосов
/ 24 марта 2011

Я использую библиотеку PHP QueryPath для извлечения данных из коллекции старых файлов HTML, и по большей части использую селекторы CSS, доступные через функцию find (), для извлечения данных.Однако не все элементы, содержащие данные, которые мне нужно извлечь, имеют уникальный идентификатор CSS, поэтому я использовал некрасивую комбинацию Regexp и QueryPath для извлечения данных.

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

Как бы я,например, чисто извлечь "Data2" из этого элемента списка?Есть ли функция QueryPath, которая позволит мне указать, например, второй дочерний элемент родительского элемента в качестве элемента для извлечения?

Ответы [ 2 ]

3 голосов
/ 23 мая 2012

Есть несколько способов сделать это.Самый простой - использовать псевдокласс CSS 3 :nth-of-type().Это получает второй LI непосредственно внутри UL:

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

:nth-of-type, а другие селекторы CSS 3 принимают так называемые правила "an + b", где вы можете сказать, сколько элементов составляют группу, а затем скажите, какой элемент из группы вы хотите.Например, tr:nth-of-type(4n+2) разделит строки таблицы на группы по 4, а затем вернет второй элемент в каждой группе.:even и :odd - это просто сокращение для 2n и 2n+1.

Другие CSS, на которые стоит обратить внимание:

  • ': nth'
  • ': first-of-type', ': first'
  • ': last-of-type', ': last'
  • ': even', ': odd'
  • ': not ()', ': has ()' и ': contains ()'

Вы также можете получить все элементы LI, а затем просто получитьвторой:

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

Или, как указывал предыдущий плакат, вы можете получить фактический объект DOMNode для второго, используя get():

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

Еслиу вас действительно сложные потребности, вы можете использовать filter(), чтобы взять список и запустить его с помощью пользовательской функции.

1 голос
/ 24 марта 2011

Для получения n-го подходящего объекта вы можете использовать QueryPath::get(n-1).

...