WebScraping с LXML.HTML и Xpath - PullRequest
       13

WebScraping с LXML.HTML и Xpath

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

Я пытаюсь извлечь информацию с веб-сайта, но, к сожалению, получаю лишь ограниченную информацию.У меня проблемы с правильным Xpath, чтобы получить больше, чем просто первый элемент всей таблицы.Для отображения Xpath я использую Chrome DevTools.Как я могу сделать Xpath более общим, чтобы получить желаемый результат?Или у кого-нибудь есть идеи, как я могу сделать это немного умнее?Моя цель - получить файл json позже.

import requests
import lxml.html

html = requests.get('http://volcano.oregonstate.edu/volcano_table')
doc = lxml.html.fromstring(html.content)

volcanoes = doc.xpath('//*[@id="content"]/div/div[2]/table/tbody/tr[1]/td[1]/a/text()')
country = doc.xpath('//*[@id="content"]/div/div[2]/table/tbody/tr[1]/td[2]/text()')
latitude = doc.xpath('//*[@id="content"]/div/div[2]/table/tbody/tr[1]/td[4]/text()')
longitude = doc.xpath('//*[@id="content"]/div/div[2]/table/tbody/tr[1]/td[5]/text()')
elevation = doc.xpath('//*[@id="content"]/div/div[2]/table/tbody/tr[1]/td[6]/text()')

output = []
for info in zip(volcanoes, country, latitude, longitude, elevation):
    resp = {}
    resp['volcanoes'] = info[0]
    resp['country'] = info[1]
    resp['latitude'] = info[2]
    resp['longitude'] = info[3]
    resp['elevation'] = info[4]
    output.append(resp)

print(output)

Вот что код может получить на данный момент:

[{'volcanoes': 'Abu', 'country': '\n            Japan          ', 'latitude': '\n            34.50          ', 'longitude': '\n            131.60          ', 'elevation': '\n            641          '}]

1 Ответ

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

Ваши определенные xpaths подвержены ошибкам. Я пытался улучшить их. Теперь следующее должно получить вам необходимый контент.

import json
import requests
from lxml.html import fromstring

res = requests.get('http://volcano.oregonstate.edu/volcano_table')
root = fromstring(res.text)
data = []
for item in root.xpath("//*[starts-with(@class,'views-table')]//tbody//tr"):
    d = {}
    d['volcan'] = item.xpath('.//td/a/text()')[0].strip()
    d['country'] = item.xpath('.//td/text()')[2].strip()
    d['lat'] = item.xpath('.//td/text()')[4].strip()
    d['longitude'] = item.xpath('.//td/text()')[5].strip()
    d['elevation'] = item.xpath('.//td/text()')[6].strip()
    data.append(d)

print(json.dumps(data,indent=4))

Вывод вы можете иметь как:

[
    {
        "volcan": "Abu",
        "country": "Japan",
        "lat": "34.50",
        "longitude": "131.60",
        "elevation": "641"
    },
    {
        "volcan": "Acamarachi",
        "country": "Chile",
        "lat": "-23.30",
        "longitude": "-67.62",
        "elevation": "6046"
    },
...