Xpath или CSS-селектор для выбора всех дочерних узлов, которые предшествуют определенному дочернему узлу

#node.js #xpath #css-selectors #apify

Вопрос:

У меня есть следующие html-данные :

 lt;span id="description"gt;  lt;pgt;descriptionlt;/pgt;  lt;pgt;descriptionlt;/pgt;  lt;pgt;lt;/pgt;  lt;h3gt;title1lt;/h3gt;  some text. lt;brgt;  lt;brgt;  some text.  lt;h3gt;title2lt;/h3gt;  lt;pgt;lt;/pgt;  lt;pgt;lt;/pgt;  lt;divgt;datalt;/divgt;  lt;h3gt;title3lt;/h3gt;  lt;stronggt;datalt;/stronggt;  lt;brgt;  some text.  lt;brgt;  lt;brgt;  some text.  lt;pgt;lt;/pgt;  lt;/spangt;  

Мне нужно, чтобы все p теги были до первого h3 тега.

Я попробовал Xpath //span[@id="description"] , который получит все дочерние элементы span тега, которые мне не нужны.

Я также попробовал //span[@id="description"]/h3[1]/preceding-sibling::p , который вернул только первый предыдущий p тег. Кроме того, выбор отдельных узлов p и их последующее объединение нецелесообразны, так как на разных страницах будет разное количество узлов p до первого h3.

Затем я попробовал использовать селекторы CSS и функцию удаления, $('#description').clone().children('div,h3').remove().end().html().trim() . Что не очень хорошо работало, так как я не могу выбирать текстовые узлы с его помощью.

Могу ли я в любом случае разделить данные с помощью этих h3 тегов?

Ответ №1:

Твое выражение лица

 //span[@id="description"]/h3[1]/preceding-sibling::p  

должно сработать.

Похожее выражение

 //span[@id="description"]/h3[1]//preceding-sibling::p  

должно также сработать.

Также попробуйте это:

 //span[@id="description"]/p[following-sibling::h3[contains(text(),"title1")]]  

Комментарии:

1. Я использую код в платформе apify, когда я использую «//span[@id=»описание»]/h3[1]/предыдущий-брат::p», он автоматически читается как «//span[@id=»описание»]/h3[1]/предыдущий-брат::p[1]» и не возвращает все теги p до h3[1].

2. @neenkart У меня нет apify, поэтому, к сожалению, я не могу проверить это сам. Вы пробовали другие варианты ответа?

3. ОК. Да, я сделал это, но все равно это вернуло только первое появление. Итак, я собираюсь объявить по крайней мере 5 вхождений в качестве переменных и объединить их в одну переменную, на некоторых страницах я могу потерять данные, все еще надеясь, что это сработает. Спасибо.