Использование логического значения для выполнения различных выражений xpath с python lxml

Я пытаюсь очистить данные о погоде с веб-сайта с помощью скрипта Python и lxml. Данные о скорости ветра будут извлечены и добавлены в список для последующей обработки. Я могу получить необходимую мне информацию, если она отформатирована следующим образом:

<div class = "day-fcst">
  <div class = "wind">
    <div class = "gust">
      "Gusts to 20-30mph"
    </div>
  </div>
</div>

Однако при слабом ветре веб-сайты добавляют дочерний класс span под div "gust" следующим образом:

<div class = "gust">
  <span class = "nowind">
    "Gusts less than 20mph"
  </span
</div>

Мой мыслительный процесс заключался в том, чтобы проверить, существует ли span, если true, затем выполнить выражение XPath, чтобы вытащить текст под span, в противном случае выполнить выражение XPath, просто чтобы вытащить текст под div "gust". Я попытался найти примеры использования логических функций XPath, но не смог заставить что-либо работать (ни в Safari Web Inspector, ни в моем скрипте).

В моем текущем коде используется Python для проверки, эквивалентен ли класс span "nowind", а затем выполняются операторы if и else, но выполняется только оператор else. Мой текущий код выглядит так:

from lxml import html
import requests

wind = []

source=requests.get('website')
tree = html.fromstring(source.content)

if tree.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]/span/@class') == 'nowind':
  wind.append(tree.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]/span/text()'))
else:
  wind.append(tree.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]/text()'))

print wind

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

0
0
214
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в обоих случаях можно использовать одно и то же выражение xpath. Просто используйте //div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]//text()

В качестве альтернативы вы можете получить элемент <div class = "wind">, а затем использовать метод text_content() для получения текстового содержимого.

In [1]: from lxml import html

In [2]: first_html = '<div class = "day-fcst"><div class = "wind"><div class = "gust">"Gusts to 20-30mph"</div></div></div>'

In [3]: second_html = '<div class = "day-fcst"><div class = "wind"><div class = "gust"><span class = "nowind">"Gusts to 20-30mph"</span></div></div></div>'

In [4]: f = html.fromstring(first_html)

In [5]: s = html.fromstring(second_html)

In [6]: f.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]')[0].text_content()
Out[6]: '"Gusts to 20-30mph"'

In [7]: s.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]')[0].text_content()
Out[7]: '"Gusts to 20-30mph"'

In [8]: print(f.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]//text()'))
['"Gusts to 20-30mph"']

In [9]: print(s.xpath('//div[@class = "day-fcst"]/div[@class = "wind"]/div[@class = "gust"]//text()'))
['"Gusts to 20-30mph"']

Спасибо, я очень ценю вашу помощь. Я подумал, что вы можете сделать это в XPath, но не смог.

Jamogriff 17.09.2018 19:22

Другие вопросы по теме