Не могу разобрать определенную информацию из некоторых элементов HTML, используя xpath - PullRequest
2 голосов
/ 03 июля 2019

Я создал выражение xpath для целевого элемента, чтобы можно было извлечь определенную информацию из некоторых html-элементов, используя xpath в scrapy.Я все равно не могу его достать.

Элементы HTML:

<div class="rates">
                <label>
                  Rates :
                </label>
                  R 3500
                  <br class="hidden-md hidden-lg">
              </div>

Я хочу извлечь из него R 3500.

Я пробовал с:

from scrapy import Selector

html = """
<div class="rates">
                <label>
                  Rates :
                </label>
                  R 3500
                  <br class="hidden-md hidden-lg">
              </div>
"""
sel = Selector(text=html)
rate = sel.xpath("//*[@class='rates']/label/following::*").get()
print(rate)

При запуске моего вышеописанного сценария я получаю <br class="hidden-md hidden-lg">, тогда как я хочу получить R 3500.

Я мог бы использовать .tail, если выбрал lxml.Однако, когда я иду на терапию, я не вижу ничего подобного.

Как извлечь этот показатель из HTML-элементов с помощью xpath?

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Чтобы получить узел text в виде following-sibling после узла label:

...
sel = Selector(text=html)
rate = sel.xpath("//*[@class='rates']/label/following-sibling::text()").get().strip()
print(rate)

Выходные данные:

R 3500

Добавление : "//*[@class='rates']/label/following::text()" также должно работать.

https://www.w3.org/TR/1999/REC-xpath-19991116#axes

1 голос
/ 03 июля 2019

В дополнение к принятому ответу , что совершенно правильно, вот объяснение, почему

//*[@class='rates']/label/following::*

с учетом документа

<div class="rates">
   <label>
   Rates :
   </label>
   R 3500
   <br class="hidden-md hidden-lg">
</div>

не не возвращает текст R 3500: * выбирает только узлы элементов , которые следуют после label элементов, но не текстовые узлы. Элементы и текстовые узлы - это разные понятия в модели документа XPath. Вы можете проверить это утверждение с немного другим документом:

<div class="rates">
   <label>
   Rates :
   </label>
   <any>R 3500</any>
   <br class="hidden-md hidden-lg">
</div>

Что заставляет ваш код возвращать элемент any.

И text() (более конкретно), и node() (более общее) выбирают этот текстовый узел, и в этом случае обе оси following:: и following-sibling:: работают.

...