XPath Wildcards для HTML

0

Я использую XPath для извлечения значений элементов DOM. Поскольку XPaths несовместимы, я использую магию подстановочных знаков, чтобы выбрать все элементы DOM на одном уровне.

Пример XPaths в документе HTML:

//div[@id='floatswrap']/div/div[2]/div[1]
//div[@id='floatswrap']/div/div[2]/div[2]
//div[@id='floatswrap']/div/div[2]/div[3]
......
//div[@id='floatswrap']/div/div[2]/div[100]

Я пробовал */div[@id='floatswrap']/div/div[2]/div (обратите внимание на символ звездочки в начале и без квадратных скобок в конце), но он терпит неудачу. Поэтому я использую следующее (пример кода для выше): //div[@id='floatswrap']/div/div[2]/div[*] (обратите внимание на звездочку внутри скобок), и она показывается.

Поскольку я новичок в XPath, есть ли лучший и более последовательный способ сделать выбор узла XPath с помощью подстановочных знаков?

EDIT: Предположим, у меня есть следующий HTML:

 <html>
 <head>
 </head>
    <body>
      <div id="floatswrap">
        <div>
         <div>First</div>
         <div>                     <!-- SELECT ALL DIV NODES WRAPPED IN THIS DIV -->
          Second

           <div>One</div>                     <!-- SELECT THIS NODE -->
           <div>Two</div>                     <!-- SELECT THIS NODE -->
           <div>Three</div>                   <!-- SELECT THIS NODE -->
           <!-- ........ -->                  <!-- SELECT ALL DIV NODES -->
           <div>Hundred</div>                 <!-- SELECT THIS NODE -->
         </div> <!-- ./Second DIV -->
       </div>
       <div> Some Text </div>         
       <div> Some Other Text </div>
      </div> <!-- ./floatswrap -->
    </body>
</html>

Я пытаюсь выбрать все DIV во втором DIV.

  • 0
    Идентификаторы уникальны, поэтому использование //div[@id=...] целесообразно. Без какого-либо примера ввода, дальнейшие комментарии по поводу того, что следует, не могут быть сделаны. Пожалуйста, опубликуйте хотя бы весь div, а также ожидаемый результат.
  • 0
    Здесь я пытаюсь выполнить итерацию по узлам DOM под определенным узлом DOM, определенным как строка XPath.
Показать ещё 3 комментария
Теги:
xpath
dom
wildcard

1 ответ

0
Лучший ответ

Если вы не дадите предикат, не будут добавлены дополнительные фильтры (но для имени элемента, здесь div). div[*] на самом деле не совсем то, что вам нужно; он выбирает только divs с другими дочерними узлами.

Это выберет весь div, который вы хотите:

//div[@id='floatswrap']/div/div[2]/div

Возможно, вам захочется добавить позиционный предикат на второй шаг оси, если он слишком много:

//div[@id='floatswrap']/div[1]/div[2]/div

Дальнейшее упрощение не представляется возможным; вы можете выбрать только div, не содержащий других элементов, но я не думаю, что это лучше в любом случае:

//div[@id='floatswrap']//div[not(*)]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню