Проблема Python в чистоте - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь извлечь значения из таблицы на этом сайте: https://www.geonames.org/search.html?q=&country=IT

В моем примере я хочу извлечь имя «Рим», и я использовал этот код:

import requests
import lxml.html

html = requests.get('https://www.geonames.org/search.html?q=&country=IT')
doc = lxml.html.fromstring(html.content)

table_body = doc.xpath('//*[@id="search"]/table')[0]

cities = table_body.xpath('//*[@id="search"]/table/tbody/tr[3]/td[2]/a[1]/text()')

У меня все хорошо, но когда я печатаю, результат:

>>> print(cities)
[]

Я действительно понятия не имею, в чем может быть проблема, у кого-то есть предложения?

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Вот простой скрипт для извлечения всех городов на этой странице

import requests
import lxml.html

html = requests.get('https://www.geonames.org/search.html?q=&country=IT')
doc = lxml.html.fromstring(html.content)
# corrected the xpath in the below line.
cities = doc.xpath("//table[@class='restable']//td[a][2]/a[1]/text()")
for city in cities:
    print(city)
0 голосов
/ 06 мая 2019

Если вы хотите получить "Rome", вы можете опустить tbody. Этот элемент был вставлен браузером и отсутствует в исходном документе, возвращенном запросом.

Кроме того, дополнительная строка table_body = doc.xpath('//*[@id="search"]/table')[0] является избыточной - вы можете искать прямо из корня.

import requests
import lxml.html

html = requests.get('https://www.geonames.org/search.html?q=&country=IT')
doc = lxml.html.fromstring(html.content)
print(doc.xpath('//*[@id="search"]/table/tr[3]/td[2]/a[1]/text()')[0]) # => Rome
...