首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取错误"pywintypes.error:(5,'OpenClipboard',‘访问被拒绝。’)“

获取错误"pywintypes.error:(5,'OpenClipboard',‘访问被拒绝。’)“
EN

Stack Overflow用户
提问于 2018-12-03 20:39:10
回答 1查看 3.1K关注 0票数 1

我正在尝试使用硒和python从this站点获取纬度和经度。我也在使用win32lipboard。但是每当我运行我的代码时,它会随机抛出这个错误pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')

这是我的代码:

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv
import win32clipboard

csvreader = csv.reader(open("master_data.csv", 'r'))

csvwriter = csv.writer(open('final_master_data.csv', 'w', newline=''))

headers = next(csvreader)
headers.append("latitude")
headers.append("longitude")
csvwriter.writerow(headers)

locations = list(csvreader)

chromedriver = 'C:\\Users\\UserName\\Downloads\\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('http://www.whatsmygps.com')

for places in locations:
    place = places[6] + ", " + places[4] + ", " + places[2]

    location = driver.find_element_by_id("address")

    location.send_keys(Keys.CONTROL, 'a')
    location.send_keys(place)

    location.submit()

    time.sleep(3)

    lat_input = driver.find_element_by_id("latitude")
    lat_input.send_keys(Keys.CONTROL, 'a')
    lat_input.send_keys(Keys.CONTROL, 'c')

    win32clipboard.OpenClipboard()
    lat = win32clipboard.GetClipboardData()

    places.append(lat)

    win32clipboard.CloseClipboard()

    lon_input = driver.find_element_by_id("longitude")
    lon_input.send_keys(Keys.CONTROL, 'a')
    lon_input.send_keys(Keys.CONTROL, 'c')

    win32clipboard.OpenClipboard()
    lon = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()

    places.append(lon)
    print(places)

    csvwriter.writerow(places)

driver.close()

因此,每当我运行此代码时,它都会毫无问题地启动,它读取csv文件并在此站点中输入位置名称,然后开始从站点复制纬度和经度,并将其插入到另一个csv文件中。但在一段时间后,它会随机抛出错误pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')。从昨天开始我就找不到这个问题的解决方案。

更新:我正在使用Anaconda,并且我以管理员身份运行anaconda shell,所以访问权限没有问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-11 12:18:38

如果剪贴板被另一个进程锁定,则可能会出现拒绝访问错误。为了避免python消息,您可以使用WinAPI版本的剪贴板,如SO链接所述:https://stackoverflow.com/a/23285159/4603670

另一种方法是使用需要API key的BingMap。在撰写本文时,您可以在https://www.bingmapsportal.com上注册一个开发人员帐户以获取免费的API密钥(我不确定配额)。

代码语言:javascript
复制
import pythoncom
import win32com.client
import json

pythoncom.CoInitialize()
winhttp = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')

def bing_find_gps(addressLine, postalCode, country):

    q = 'http://dev.virtualearth.net/REST/v1/Locations?key='
    q = q + 'my_api_key'
    if country: q = q + '&countryRegion=' + country
    if postalCode: q = q + '&postalCode=' + postalCode
    if addressLine: q = q + '&addressLine=' + addressLine

    try:
        winhttp.Open('GET', q, False)
        winhttp.Send()
        if not winhttp.responseText:
            return 0
        list = json.loads(winhttp.responseText)
        if list['statusCode'] != 200:
            return 0
        gps = list['resourceSets'][0]['resources'][0]['point']['coordinates']
        if gps:
            return (1, gps[0], gps[1])
    except:
        return 0

res = bing_find_gps('One Microsoft Way, Redmond, WA, 98052-6399', '0', 'United States')
if res:
    print("lat/long %s, %s" % (res[1], res[2]))
res = bing_find_gps(0, '98052-6399', 'United States')
if res:
    print("lat/long %s, %s" % (res[1], res[2]))

或者使用openstreetmap.org

代码语言:javascript
复制
address = "98052-6399" #Testing with Microsoft zip code
url = "https://nominatim.openstreetmap.org/search?format=json&q=" + address
winhttp.Open('GET', url, False)
winhttp.Send()
list = json.loads(winhttp.responseText)
print(list[0].get('lat'))
print(list[0].get('lon'))

预期输出:

纬度: 47.670119经度:-122.118237

或者,您可能还希望避免完全复制元素,请使用get_attribute('value')读取latitudelongitude中的值。示例:

代码语言:javascript
复制
chromedriver = 'C:\\Users\\UserName\\Downloads\\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('http://www.whatsmygps.com')

element = driver.find_element_by_id("address")
element.send_keys(Keys.CONTROL, 'a')
#enter Microsoft's zip code
element.send_keys('98052-6399')
element.submit()
time.sleep(3)

lat_input = driver.find_element_by_id("latitude")
print('latitude: ')
print(lat_input.get_attribute('value'))

lon_input = driver.find_element_by_id("longitude")
print('longitude: ')
print(lon_input.get_attribute('value'))

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

https://stackoverflow.com/questions/53594046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档