如何使用 beautifulsoup 从 html 页面中抓取纬度/经度数据

Posted

技术标签:

【中文标题】如何使用 beautifulsoup 从 html 页面中抓取纬度/经度数据【英文标题】:How to use beautifulsoup to scrape the Latitude/Longitude data from html page 【发布时间】:2016-02-04 06:41:41 【问题描述】:

我正在尝试从这个网站上抓取纬度和经度数:

http://www.healthgrades.com/provider-search-directory/search?q=Dentistry&prof.type=provider&search.type=&method=&loc=New+York+City%2C+NY+&pt=40.71455%2C-74.007118&isNeighborhood=&locType=%7Cstate%7Ccity&locIsSolrCity=false

对于每个提供者,如果你看元素,它看起来像

div class="listing" data-lat="40.66862" data-lng="-73.98574" data-listing="22"

如何使用beautifulsoup获取此处的经纬度数?

我尝试在我的脚本中使用正则表达式,

下面是我的脚本 -

Geo = soup.find("div", class_="providerSearchResults")
print Geo.findAll("div", data-lat_= re.compile('[0-9.]'))

但我收到此错误消息:“SyntaxError: 关键字不能是表达式”

此外,对于每个提供者,“div”部分总是会发生变化 可以是:

div class="listing" data-lat="40.66862" data-lng="-73.98574" data-listing="22"

div class="listingfirst" data-lat="40.66862" data-lng="-73.98574" data-listing="22"

甚至

div class="listing enhancedlisting" data-lat="40.66862" data-lng="-73.98574" data-listing="22"

【问题讨论】:

python 正则表达式包 (re) 没有属性/方法 .find,这就是您收到该错误的原因。 【参考方案1】:

首先提出几个要求:

pip install requests
pip install BeautifulSoup
pip install lxml

latlongbs4.py:

import requests
from bs4 import BeautifulSoup

r = requests.get('http://www.healthgrades.com/provider-search-directory/search?q=Dentistry&prof.type=provider&search.type=&method=&loc=New+York+City%2C+NY+&pt=40.71455%2C-74.007118&isNeighborhood=&locType=%7Cstate%7Ccity&locIsSolrCity=false')
soup = BeautifulSoup(r.text, 'lxml')
latlonglist = soup.find_all(attrs="data-lat": True, "data-lng": True)
for latlong in latlonglist:
    print latlong['data-lat'], latlong['data-lng']

编辑: 从 attrs 字典中删除了 class

输出:

(latlongbs4)macbook:latlongbs4 joeyoung$ python latlongbs4.py
40.71851 -74.00984
40.77536 -73.97707
40.71961 -74.00347
40.71395 -74.008
40.711614 -74.015901
40.724576 -74.001771
40.7175 -74.00087
40.71961 -74.00347
40.71766 -73.99293
40.71961 -74.00347
40.71848 -73.99648
40.709917 -74.009884
40.71553 -74.00977
40.71702 -73.996
40.71254 -73.99994
40.70869 -74.01164
40.70994 -74.00764
40.707325 -74.003982
40.7184 -74.00098
40.71373 -74.00812
40.710474 -74.009844
40.7175 -74.00087
40.727582 -73.894632
40.763469 -73.963106
40.724853 -73.841097

几点说明:

我在字典中使用了attrs 关键字,因为:

某些属性,例如 html 5 中的 data-* 属性,具有以下名称 不能用作关键字参数的名称:

您可以在搜索中使用这些属性,方法是将它们放入 字典并将字典作为属性传递给 find_all() 论据:

来源: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-keyword-arguments

【讨论】:

我只是意识到使用此代码存在一个问题。正如我所说,div 之后的关键字从提供者变为提供者。所以如果我只使用 div class= "listing",我会错过一些提供者。 您可以从字典中取出"class": "listing",,只要该div 仍然包含data-latdata-lng 属性,它仍然可以工作。当我在那个 url 上尝试它时,我没有看到任何类似的情况。 您可以在我的原始问题中找到更多详细信息。另外,我尝试将正则表达式用于“列表”,例如“^listing.*”。但这会给我一堆无用的数据,比如 div class= listingInner 或 div class= listingBody 只需从字典中完全删除class。看起来你真的不需要它来获得经纬度。

以上是关于如何使用 beautifulsoup 从 html 页面中抓取纬度/经度数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 beautifulsoup 从 html 页面中抓取纬度/经度数据

如何从 BeautifulSoup4 中的 html 标签中找到特定的数据属性?

如何使用 beautifulsoup 从(可能)损坏的 html 中过滤掉 .mp3 链接? (JSON)

如何使用 BeautifulSoup 在标签内获取 html 文本

Python/BeautifulSoup - 如何从元素中删除所有标签?

如何从 BeautifulSoup 对象中提取 JSON?