【问题标题】:How can I get output data from this webpage using Python?如何使用 Python 从该网页获取输出数据?
【发布时间】:2014-12-08 15:35:52
【问题描述】:

我正在尝试使用此网站获取两个地址之间的地理距离:http://www.freemaptools.com/how-far-is-it-between.htm

我希望能够进入该页面,输入两个地址,点击“显示”,然后提取“乌鸦飞的距离”和“陆路运输的距离”值​​并将它们保存到字典中。

有没有办法从这个网页获取输出数据(距离),我不熟悉 html,所以我不确定输出在哪里。我已经输入了数据,下面是我的代码供参考。

网页源代码:我无法破译

<tr>
<td align="right">From 
    <input name="pointa" type="text" value="" size="22" onkeypress="autocompletea(this.value, event)" /></td>
<td><div align="center">to</div></td>
<td><input name="pointb" type="text" value="" size="22" onkeypress="autocompleteb(this.value, event)"/></td>
<td><p role="button" tabindex="0" class="fmtbutton" onkeypress="findaandb(document.forms['inp']['pointa'].value,document.forms['inp']['pointb'].value);" onclick="findaandb(document.forms['inp']['pointa'].value,document.forms['inp']['pointb'].value);">&nbsp;Show&nbsp;</p>
  <label></label></td>
</tr>

我的代码:

import re
from mechanize import Browser

text = """ web input"""

browser = Browser()
browser.open("http://www.freemaptools.com/how-far-is-it-between.htm")

browser.select_form(nr=0)
browser['pointa'] = 'San Diego, Usa'
browser['pointb'] = 'San Francisco, Usa'

response = browser.submit()

content = response.read()

result = re.findall(r'dist', content)
print result[5]

感谢您的帮助

【问题讨论】:

  • 该 Web 表单调用了一个 Javascript 函数,findaandb。推测该函数是在内联script 标记或外部.js 脚本文件中定义的,它可能会修改现有页面而不是下载新页面。因此,您不能只阅读新页面,因为没有可阅读的页面。
  • 你可以使用selenium之类的东西来驱动一个真正的浏览器,或者嵌入一个JavaScript解释器并无头运行它,或者阅读JavaScript代码并尝试手动将它移植到Python,或者其他各种可能性,但在这里没有什么容易的。

标签: python web-scraping html-parsing web-crawler


【解决方案1】:

此页面大量使用了 javascript,其机制无法像浏览器那样处理。

如果您检查源,您可以使用多个 api 和计算来查看它,例如使用主 api 和作为乌鸦飞行计算,您可以通过这种方式获得距离

import requests
import math
from BeautifulSoup import BeautifulSoup

def distance_on_unit_sphere(lat1, long1, lat2, long2):
    "src: http://www.johndcook.com/python_longitude_latitude.html"
    degrees_to_radians = math.pi/180.0

    phi1 = (90.0 - lat1)*degrees_to_radians
    phi2 = (90.0 - lat2)*degrees_to_radians
    theta1 = long1*degrees_to_radians
    theta2 = long2*degrees_to_radians
    cos = (math.sin(phi1)*math.sin(phi2)*math.cos(theta1 - theta2) + 
           math.cos(phi1)*math.cos(phi2))
    arc = math.acos( cos )
    return arc * 3960 # To get the distance in kilometers, multiply by 6373 instead

def main():
    r = requests.get('http://www.freemaptools.com/ajax/getaandb.php?a=Sydney_Australia&b=Melbourne_Australia&c=1317')
    xml = BeautifulSoup(r.text)

    lat1 = float(xml.markers.findAll('marker')[0]['lat']);
    lng1 = float(xml.markers.findAll('marker')[0]['lng']);
    lat2 = float(xml.markers.findAll('marker')[1]['lat']);
    lng2 = float(xml.markers.findAll('marker')[1]['lng']);

    print distance_on_unit_sphere(lat1, lng1, lat2, lng2)

if __name__ == '__main__':
    main()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多