Использование логического значения для выполнения различных выражений XPath с помощью Python lxml - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь очистить данные о погоде с веб-сайта, используя скрипт 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, ни в моем скрипте).

Мой текущий код использует 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, поэтому я не знаком с использованием каких-либо его функций.

1 Ответ

0 голосов
/ 14 сентября 2018

возможно иметь одинаковое выражение 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"']
...