首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检查某个位置名称的谷歌地图拼写

检查某个位置名称的谷歌地图拼写
EN

Stack Overflow用户
提问于 2017-03-30 08:55:11
回答 1查看 195关注 0票数 0

我想用谷歌地图获得欧洲一些机场之间的旅行时间。问题是,有些名字的拼写不准确,所以,我想首先检查错误的名称,并得到谷歌的版本的名称。从这个question中,我可以使用selenium来完成这个任务,但是我的代码有一些问题: 1)输出并不总是完整的,(最后两个结果只有一个字母表) 2)它在列表的末尾抛出一个异常(参见下面)。请帮我修一下密码。自动化是唯一的方法,因为机场清单很长。

输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wronglySpelled = ['Treviso (San Angelo) Airport', 'Milano - Malpensa
       Airport', 'Venezia - Tessera Airport', 'Milano - Linate Airport',
       'Treviso (San Angelo) Airport', 'Treviso (San Angelo) Airport',
      'Milano - Malpensa Airport', 'Venezia - Tessera Airport', 'Guernsey
       Channel Is. Airport', 'Jersey Channel Is. Airport','Treviso (San
                     Angelo) Airport']

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def setup():
    driver = webdriver.Chrome()
    driver.get("http://maps.google.com")
    driver.maximize_window() # For maximizing window
    driver.implicitly_wait(20) # gives an implicit wait for 20 seconds
    return driver

def correct_name(driver, name_to_check):
    searchBox = driver.find_element_by_name('q')
    searchBox.send_keys(name_to_check)
    correct_name = driver.find_element_by_class_name('suggest-bold')
    return correct_name.text.encode('utf-8')

driver = setup()
for item in wronglySpelled:
    print item,':', correct_name(driver, item)
    time.sleep(5)
    driver.find_element_by_id('searchboxinput').clear()
driver.quit()

错误消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Traceback (most recent call last):
  File "C:/...", line 60, in <module>
    print item,':', correct_name(driver, item)
  File "C:/...", line 41, in correct_name
    correct_name = driver.find_element_by_class_name('suggest-bold')
  File "C:\...", line 415, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\...", line 756, in find_element
    'value': value})['value']
  File "C:\...", line 238, in execute
    self.error_handler.check_response(response)
  File "C:\...", line 193, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"class name","selector":"suggest-bold"}
  (Session info: chrome=56.0.2924.87)
  (Driver info: chromedriver=2.28.455520 (cc17746adff54984afff480136733114c6b3704b),platform=Windows NT 10.0.14393 x86_64)

产出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Formatted as Input name : Google maps version
Treviso (San Angelo) Airport : Aeroporto di Treviso Canova
Milano - Malpensa Airport : Milano Malpensa Airport
Venezia - Tessera Airport : Venice Marco Polo Airport
Milano - Linate Airport : Aeroporto Milano Linate
Treviso (San Angelo) Airport : Aeroporto di Treviso Canova
Treviso (San Angelo) Airport : Aeroporto di Treviso Canova
Milano - Malpensa Airport : m
Venezia - Tessera Airport : V
Guernsey Channel Is. Airport :
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 07:45:51

正如@JeffC在他的评论中提到的那样,您最好使用Google来完成您想要做的任何事情。

你的剧本里有几件事:

  • 我发现隐含的等待大多是毫无价值的。在我看来,学习明确等待、它们如何工作以及它们什么时候有用是值得的。因为Google倾向于使用AJAX在其大量信息中使用的高度动态的网站,所以如果您使用显式等待,像Maps这样的东西往往工作得最好。
  • 你的脚本抛出了NoSuchElementException,因为谷歌对这个词没有任何建议,所以你的搜索词,suggest-bold从来没有匹配任何东西。通常,当我看到一个NSEE,它是一个危险的标志,我需要重新评估我的搜索方式。
  • 我认为(但不是肯定的) Milano - Malpensa Airport : m输出是selenium在元素完全加载之前从元素中收集文本的结果。
  • 我个人不惜一切代价避免硬睡眠(time.sleep(5)),因为如果您遇到任何网络延迟,它们很容易导致脚本中断。这是显式等待闪耀的另一个区域,因为他们可以尝试并尝试找到一个元素,直到它实际加载,然后继续。

话虽如此,我还是这样做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from explicit import waiter, ID
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait as Wait
from selenium.common.exceptions import StaleElementReferenceException

NO_SUGGESTION = 'Add a missing place to Google Maps.'

original_names = [
    'Treviso (San Angelo) Airport',
    'Milano - Malpensa Airport',
    'Venezia - Tessera Airport',
    'Milano - Linate Airport',
    'Treviso (San Angelo) Airport',
    'Treviso (San Angelo) Airport',
    'Milano - Malpensa Airport',
    'Venezia - Tessera Airport',
    'Guernsey Channel Is. Airport',
    'Jersey Channel Is. Airport',
    'Treviso (San Angelo) Airport'
]


def get_name_suggestion(driver, name):
    # Find the search box, clear it, write the name
    waiter.find_write(driver, 'searchboxinput', name, by=ID, clear_first=True)

    class SuggestionLoads(object):
        def __init__(self):
            self._last_seen = None

        def __call__(self, driver):
            """ Custom expected condition.
                Returns either the first suggested name, or '<No Suggestion>'
                Raises a TimeoutException in the event the page source is different
            """
            suggestion_icon = 'div.suggest-icon-container'
            suggest_css = 'div.suggest-left-cell > span.suggest-query'
            try:

                # Only want suggestions that have the location icon next to them, and not the
                # magnifying glass. Return False if we don't find any so as to retry
                icons = driver.find_elements_by_css_selector(suggestion_icon)
                if len(icons) < 1:
                    return False

                elems = driver.find_elements_by_css_selector(suggest_css)

                if len(elems) == 0:
                    # No suggestions have loaded yet, return False so the Wait can retry
                    return False

                suggest_text = elems[0].text
                if len(suggest_text) == 1:
                    # Sometimes we catch text mid-update. Return False to retry
                    # and hopefully get the whole suggestion
                    return False
                elif suggest_text == NO_SUGGESTION:
                    # Google has no suggestion for us, return NO_SUGGESTION, which the Wait will
                    # evaluate as True and exit
                    return '<No Suggestion>'
                else:
                    # We found a valid suggestion. We need to make sure nothing else is going to
                    # get AJAXed in, so compare it to or _last_seen property. If they match,
                    # everything has stabilized and return the string, which will be evaluated as
                    # True and cause the Wait to exit
                    # If you don't do this, you wind up with jung suggestions like "Traffic"
                    if suggest_text == self._last_seen:
                        return suggest_text
                    else:
                        self._last_seen = suggest_text
                        return False

            except StaleElementReferenceException:
                # Because the DOM is constantly updating, there is a pretty decent chance that a
                # SERE will get thrown. Catch it if it does and return False so the Wait
                # can try again
                return False

    return Wait(driver, 30).until(SuggestionLoads())


def main():
    driver = webdriver.Chrome()
    try:
        driver.get("http://maps.google.com")
        driver.maximize_window()
        for orig_name in original_names:
            suggested_name = get_name_suggestion(driver, orig_name)
            print "{0}: {1}".format(orig_name, suggested_name)
    finally:  # This is useful to make sure the browsers get closed, even if an exception is thrown
        driver.quit()


if __name__ == "__main__":
    main()

返回:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 (.venv27) ➜  tmp python google_maps.py
 Treviso (San Angelo) Airport: Aeroporto di Treviso Canova
 Milano - Malpensa Airport: Milano Malpensa Airport
 Venezia - Tessera Airport: Venice Marco Polo Airport
 Milano - Linate Airport: Aeroporto Milano Linate
 Treviso (San Angelo) Airport: Aeroporto di Treviso Canova
 Treviso (San Angelo) Airport: Aeroporto di Treviso Canova
 Milano - Malpensa Airport: Milano Malpensa Airport
 Venezia - Tessera Airport: Venice Marco Polo Airport
 Guernsey Channel Is. Airport: <No Suggestion>
 Jersey Channel Is. Airport: <No Suggestion>
 Treviso (San Angelo) Airport: Aeroporto di Treviso Canova

完全披露者:explicit是我维护的一个库,可以从PyPI:pip install explicit获得。它的目的是使使用显式等待更容易,但您可以将其替换为花园品种等待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43123993

复制
相关文章
为什么 build 方法放在 State 中而不是在 StatefulWidget 中
为什么 build 方法放在 State 中而不是在 StatefulWidget 中呢?其中前2点是源代码的注释中给出的原因,最后一点是我的一点个人理解。
老孟Flutter
2021/01/28
9130
Django 2.1.7 Admin - 列表页选项
https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial07/
Devops海洋的渔夫
2019/07/08
1.1K0
Django 2.1.7 Admin - 列表页选项
39. Django 2.1.7 Admin - 列表页选项
1)打开assetinfo/admin.py文件,修改ServerInfoAdmin类如下:
Devops海洋的渔夫
2022/01/17
3880
39. Django 2.1.7 Admin - 列表页选项
WideNet:让网络更宽而不是更深
这是新加坡国立大学在2022 aaai发布的一篇论文。WideNet是一种参数有效的框架,它的方向是更宽而不是更深。通过混合专家(MoE)代替前馈网络(FFN),使模型沿宽度缩放。使用单独LN用于转换各种语义表示,而不是共享权重。
deephub
2023/08/30
2180
WideNet:让网络更宽而不是更深
在 Django Admin 后台发布文章
在此之前我们完成了 Django 博客首页视图的编写,我们希望首页展示发布的博客文章列表,但是它却抱怨:暂时还没有发布的文章!如它所言,我们确实还没有发布任何文章,本节我们将使用 Django 自带的 Admin 后台来发布我们的博客文章。 创建 Admin 后台管理员账户 要想进入Django Admin 后台,首先需要创建一个超级管理员账户。我们在 让 Django 完成翻译:迁移数据库 中已经创建了一个后台账户,但如果你没有按照前面的步骤创建账户的话,可以运行 python manage.py cre
追梦人物
2018/04/17
2.1K0
在 Django Admin 后台发布文章
Django之templatetags自定义标签和过滤器的使用
2、创建任意 .py 文件,如:myTag.py 3、myTag.py文件: from django import template from django.utils.safestring import mark_safe register = template.Library(); # register 不能改变
菲宇
2022/05/06
1.7K0
在django-admin中使用django-ckeditor
在最新学习python中,使用django搭建博客系统,管理后台直接使用django自带的admin模块,所以遇到富文本编辑的问题,经过查阅资料,发现了django-ckeditor这个小插件,下面小威就分享一点点来自小白的经验吧~
用户2619822
2022/06/10
1.6K0
在django-admin中使用django-ckeditor
Django 1.10中文文档-第一个应用Part7-自定义管理站点
目录[-] 开发第一个Django应用,Part7 本教程上接Part6。将继续完成这个投票应用,本节将着重讲解如果用Django自动生成后台管理网站。 自定义管理表单 通过admin.site.register(Question)注册了Question后,Django可以自动构建一个默认的表单。如果您需要自定义管理表单的外观和功能。你可以在注册时通过配置来实现。 现在先来试试重新排序表单上的字段。只需要将admin.site.register(Question)所在行替换为: # polls/admi
jhao104
2018/03/20
3.6K0
Django 1.10中文文档-第一个应用Part7-自定义管理站点
编程是一种思想,而不是敲代码
编程是一个先思考再编码的过程,思考是优于编码技能的,在思考过程中我们会考虑代码的可重用性、可靠性、更容易被他人理解,这时就会使用到设计模式让代码编写工程化,这篇文章整理了设计模式的六大原则。
新亮
2020/05/26
3750
编程是一种思想,而不是敲代码
如何修改django的app在admin中显示的名称
在django的开发中,很多时候我们希望app在admin中显示成我们想要的中文名,而不是显示默认的app_label名称。 比如我们有一个blog应用,在我们的blog app目录下面,默认会生成一个apps.py文件,类似:
小海怪的互联网
2019/09/25
3.4K0
如何修改django的app在admin中显示的名称
Django Admin后台管理
Django通过简单配置就可以实现数据模型的后台管理。一般管理界面是给系统管理员使用的,以完成数据的CURD。
菜菜cc
2022/11/15
2.8K0
Django Admin后台管理
Django3.2边学边记—Adimn站点管理
ModelAdmin类可以控制不同模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式
玖柒的小窝
2021/09/24
1.2K0
Django3.2边学边记—Adimn站点管理
什么在代码中要求我们使用LocalDateTime而不是Date?
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?
用户1516716
2019/11/24
1.1K0
在非admin页面使用 Django Ueditor(二)
Django Ueditor的安装和在admin页面的使用请看,接下来的内容是基于这篇文章的环境进行的:使用 Django Ueditor 富文本编辑器(一),如果你按照下面的流程来做还有关于Ueditor的报错,很有可能是没有装好环境。。 总体流程 以文章模型为例 1、创建文章模型 2、创建该文章模型的Form 3、写个html界面 4、写个视图函数article(),并提供这个Form给前端渲染 5、写个路由,并配置好settings.py文件 具体实现过程 在app中: 1、创建文章模型 from D
benny
2020/04/23
7060
在非admin页面使用 Django Ueditor(二)
Django快速入门——投票程序(7) 自定义后台
通过admin.site.register(Question)注册Question模型,Django会创建默认的表单在后台显示。但有时需要自定义后台的显示,可以通过继承admin.ModelAdmin实现:
一只大鸽子
2023/09/02
2420
Django快速入门——投票程序(7) 自定义后台
Django3.2边学边记—Adimn站点管理
ModelAdmin类可以控制不同模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式
用户1503405
2021/09/27
1.3K0
django admin 美化
django admin 美化主题,采用layui 作为基本框架,改写大部分页面 说明 安装 pip install django-simpleui 升级 pip install django-simpleui --upgrade 克隆源码本地安装 git clone https://github.com/newpanjing/simpleuicd simpleui python setup.py sdist install 项目 settings.py 的INSTALLED_APPS 第一行加入 simp
小贝壳
2020/03/05
7620
点击加载更多

相似问题

如何让文本显示在顶部而不是侧面?

20

有没有一种方法可以在模型中表达Django管理设置,而不是admin.py?

41

有没有一种方法可以使对象始终位于显示列表的顶部?

20

有没有一种方法可以从底部而不是从顶部在RecyclerView中堆叠CardView?

228

Django admin DoesNotExist位于/admin/

100
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文