使用 python 从网站抓取数据列表的最佳方式
Best way to scrape a list of data from a website with python
我正在从网页中抓取数据用于 API 并寻找最 pythonic / 合适的方法来完成它 - 页面源有一个标题为字典的列表'markerData' 我需要获取纬度和经度值。
数据样本:
"markerData":
[{"docEl":null,"lid":0,"clickable":true,"lat":34.0489281,"lng":-111.0937311,"title":"","iconURL":"//assets.bankofamerica.com/images/mapmarker2.png","info":"</div>View all locations in
Arizona</a></div></div></div></div></div>"},
{"docEl":null,"lid":1,"clickable":true,"lat":35.20105,"lng":-91.8318334,"title":"","iconURL":"//assets.bankofamerica.com/images/mapmarker2.png","info":"</div>View all locations in
Arkansas</a></div></div></div></div></div>"},
我过去曾多次使用 python 的 lxml 模块来完成此类任务,但是我的 'markerData' 并不是一个明显的 html 结构我正在尝试找出继续进行的最佳方法。具体来说,在下面的函数中,我一直在尝试为我的每个纬度和经度值定义 tree.xpath。
lats = []
lngs = []
def get_coordinates():
i = 0
while i < 35:
page = requests.get('https://locators.bankofamerica.com/&check_list=4429#')
tree = html.fromstring(page.content)
lat = tree.xpath('//div[@id=mapWrap/markerData/lat/text()'.format(i))
lng = tree.xpath('//div[@id=mapWrap/markerData/lng/text()'.format(i))
str1 = ''.join(lat)
str2 = ''.join(lng)
lats.append(str1)
lngs.append(str2)
i += 1
return lats, lngs
我也无法抗拒可能有更简单的方法来执行此操作的感觉,例如将整个 page-source 读入文本文件并尝试仅获取 'markerData' 列表。
对于为我的纬度和经度值定义 xpath 的任何帮助,或者关于如何隔离和捕获此数据的任何替代想法,我将不胜感激。
这是我编写的函数,它为我完成了工作,以防它可以帮助处于类似情况的其他人:
def get_coordinates():
page = requests.get('https://locators.bankofamerica.com/&check_list=4429')
tree = html.fromstring(page.content)
lat_lng = tree.xpath("//script[contains(., 'markerData')]/text()")
lat_lng_string = str(lat_lng)
latitude = re.findall('"lat":\d+\.\d+', lat_lng_string)
longitude = re.findall('"lng":-\d+\.\d+', lat_lng_string)
la = re.findall('\d+\.\d+', str(latitude))
lo = re.findall('-\d+\.\d+', str(longitude))
coords = dict(zip(la, lo))
return coords
我正在从网页中抓取数据用于 API 并寻找最 pythonic / 合适的方法来完成它 - 页面源有一个标题为字典的列表'markerData' 我需要获取纬度和经度值。
数据样本:
"markerData": [{"docEl":null,"lid":0,"clickable":true,"lat":34.0489281,"lng":-111.0937311,"title":"","iconURL":"//assets.bankofamerica.com/images/mapmarker2.png","info":"</div>View all locations in Arizona</a></div></div></div></div></div>"}, {"docEl":null,"lid":1,"clickable":true,"lat":35.20105,"lng":-91.8318334,"title":"","iconURL":"//assets.bankofamerica.com/images/mapmarker2.png","info":"</div>View all locations in Arkansas</a></div></div></div></div></div>"},
我过去曾多次使用 python 的 lxml 模块来完成此类任务,但是我的 'markerData' 并不是一个明显的 html 结构我正在尝试找出继续进行的最佳方法。具体来说,在下面的函数中,我一直在尝试为我的每个纬度和经度值定义 tree.xpath。
lats = []
lngs = []
def get_coordinates():
i = 0
while i < 35:
page = requests.get('https://locators.bankofamerica.com/&check_list=4429#')
tree = html.fromstring(page.content)
lat = tree.xpath('//div[@id=mapWrap/markerData/lat/text()'.format(i))
lng = tree.xpath('//div[@id=mapWrap/markerData/lng/text()'.format(i))
str1 = ''.join(lat)
str2 = ''.join(lng)
lats.append(str1)
lngs.append(str2)
i += 1
return lats, lngs
我也无法抗拒可能有更简单的方法来执行此操作的感觉,例如将整个 page-source 读入文本文件并尝试仅获取 'markerData' 列表。
对于为我的纬度和经度值定义 xpath 的任何帮助,或者关于如何隔离和捕获此数据的任何替代想法,我将不胜感激。
这是我编写的函数,它为我完成了工作,以防它可以帮助处于类似情况的其他人:
def get_coordinates():
page = requests.get('https://locators.bankofamerica.com/&check_list=4429')
tree = html.fromstring(page.content)
lat_lng = tree.xpath("//script[contains(., 'markerData')]/text()")
lat_lng_string = str(lat_lng)
latitude = re.findall('"lat":\d+\.\d+', lat_lng_string)
longitude = re.findall('"lng":-\d+\.\d+', lat_lng_string)
la = re.findall('\d+\.\d+', str(latitude))
lo = re.findall('-\d+\.\d+', str(longitude))
coords = dict(zip(la, lo))
return coords