Загрузка данных о широте / долготе, которые указаны только в имени файла - PullRequest
1 голос
/ 05 марта 2019

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

В настоящее время на сайте нет доступных данных о широте и долготе, но при загрузке файлов их заголовки в конечном итоге выглядят так, как показано в следующем примере:

 _DW0435 B (18.082454357146347 -67.03902682209014) Primary 3_04_19 3_05_19

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

Ниже приведена карта всех доступных фиолетовых воздушных устройств:

https://www.purpleair.com/gmap?&zoom=11&lat=36.53411774316267&lng=-121.59676190898591&clustersize=29&orderby=L&latr=0.5048243411266071&lngr=0.9551239013671875

Вот список датчиков всех доступных загружаемых данных:

https://www.purpleair.com/sensorlist

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

CSV_FILE
18.38 -67.93
45.2  -32

и т.д ...

Я предполагаю, что потребуется некоторое отношение python / MATLAB к HTML, чтобы успешно загрузить пакет координат широты и долготы, соответствующих точкам, но мой ограничивающий фактор заключается в том, что у меня нет опыта работы с HTML. Любая помощь будет оценена!

Спасибо, Taylor

1 Ответ

1 голос
/ 06 марта 2019

это должно сделать это:

import requests
from lxml import html
import re

if __name__ == "__main__":
    response = requests.get('https://www.purpleair.com/sensorlist')
    xpath = '//td//button[1]/@onclick'

    for cnt in range(10):
        tree = html.fromstring(response.content[len(response.content)//10*cnt:len(response.content)//10*(cnt+1)])
        onclick_info_from_buttons = tree.xpath(xpath)
        position_re = re.compile(r'(\(-?\d+.\d+ -?\d+.\d+\))')
        results = [position_re.findall(tmp) for tmp in onclick_info_from_buttons]
        results = results[::2]
        results = [x[0] for x in results if x]
        with open('positions.csv', 'a') as f:
            i = 0
            for result in results:
                f.write(f"{result[1:-1]}\n")
                print(i/len(results)*10*(cnt+1), '%')
                i += 1

Это решение, вероятно, не велико, но делает свою работу.

Обратите внимание, что я использовал Python 3.6 для f-строк (f"{result[1:-1]}\n"), описанныхздесь: https://docs.python.org/3/reference/lexical_analysis.html#f-strings

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я нарезал данные на 10 частей, чтобы мы могли видеть, сколько данных было сохранено в результирующий файл.Весь набор данных довольно большой, и может показаться, что скрипт перестал работать.

Также необходимо установить библиотеку lxml (pip3 install lxml).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...