下载 Latitude/Longitude 仅在文件名中列出的数据
Downloading Latitude/Longitude Data That Is Only Listed In File Name
我有兴趣检索与地图上和我列出的链接上的可下载文件中列出的点相对应的纬度和经度数据。我正在寻找这些数据,以便找到 co-located EPA 网站。
目前,网站上没有公开的经纬度数据,但是当您下载文件时,它们的标题最终如下例所示:
_DW0435 B (18.082454357146347 -67.03902682209014) Primary 3_04_19 3_05_19
括号内的数字是经纬度坐标,所以我知道一定有办法批量检索这些数据。
以下是所有可用的紫色空气设备的地图:
以下是所有可用可下载数据的传感器列表:
https://www.purpleair.com/sensorlist
如果可能的话,我的目标是只提取每个可用数据文件的纬度和经度,并将它们存储在 csv 文件中的相应列中...有点像这样:
CSV_FILE
18.38 -67.93
45.2 -32
等...
我想它需要 python/MATLAB 到 HTML 的某种关系才能成功下载与点对应的批次经纬度坐标,但我这里的限制因素是我没有任何 HTML 经验。如有任何帮助,我们将不胜感激!
谢谢,
泰勒
应该这样做:
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
)。
我有兴趣检索与地图上和我列出的链接上的可下载文件中列出的点相对应的纬度和经度数据。我正在寻找这些数据,以便找到 co-located EPA 网站。
目前,网站上没有公开的经纬度数据,但是当您下载文件时,它们的标题最终如下例所示:
_DW0435 B (18.082454357146347 -67.03902682209014) Primary 3_04_19 3_05_19
括号内的数字是经纬度坐标,所以我知道一定有办法批量检索这些数据。
以下是所有可用的紫色空气设备的地图:
以下是所有可用可下载数据的传感器列表:
https://www.purpleair.com/sensorlist
如果可能的话,我的目标是只提取每个可用数据文件的纬度和经度,并将它们存储在 csv 文件中的相应列中...有点像这样:
CSV_FILE
18.38 -67.93
45.2 -32
等...
我想它需要 python/MATLAB 到 HTML 的某种关系才能成功下载与点对应的批次经纬度坐标,但我这里的限制因素是我没有任何 HTML 经验。如有任何帮助,我们将不胜感激!
谢谢, 泰勒
应该这样做:
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
)。