小编ash*_*ets的帖子

Python Selenium:当浏览器无头时无法通过 xpath 找到元素

我正在尝试使用以下代码使用 Python Selenium 登录网站:

import time
from contextlib import contextmanager
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

@contextmanager
def getBrowser(*options):
    chrome_options = Options()
    if options: [chrome_options.add_argument(option) for option in options]
    browser = webdriver.Chrome(chrome_options=chrome_options)
    try:
        yield browser
    finally:
        browser.quit()


with getBrowser() as browser:
    browser.get('https://www.vinted.com/members/notifications')

    time.sleep(20)
    browser.find_element_by_xpath('//*[@id="content"]/div/div[2]/div/div/div[6]/div[3]/div[3]/a/span').click()
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是当我将--headless选项添加到浏览器时,它会引发一个NoSuchElementException.

错误引发代码:

with getBrowser('--headless') as browser:
    browser.get('https://www.vinted.com/members/notifications')

    time.sleep(20)
    browser.find_element_by_xpath('//*[@id="content"]/div/div[2]/div/div/div[6]/div[3]/div[3]/a/span').click()
Run Code Online (Sandbox Code Playgroud)

追溯:

Traceback (most recent call last):

  File "<ipython-input-4-fe0834deb137>", line 1, in <module>
    runfile('C:/Users/Alec/vinted test case.py', wdir='C:/Users/Alec')

  File "C:\Users\Alec\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in …
Run Code Online (Sandbox Code Playgroud)

python selenium-chromedriver selenium-webdriver

7
推荐指数
2
解决办法
8514
查看次数

基于距离的分类

我有三维整数数组(~4000 x 6000 x 3),我需要以特定的方式进行分类.我希望有类似k-means聚类方法的东西,但不是输入我希望输入簇的最大半径的簇数.

换句话说,给定一个定义大小的球体,我想找到覆盖所有数据的最小数量的非空球体并相应地对点进行分类.

虽然我对该领域知之甚少,但我一直在研究聚类算法一段时间,并没有找到一个可以实现这一点的算法.

例如,给定一个随机数据集:

import numpy as np

randomArray = np.random.rand(10,10,3)*500

Out[8]: 
array([[[ 256.68932025,  153.07151992,  196.19477623],
        [  48.05542231,  346.1289173 ,  327.44694932],
        [ 427.87340594,  197.26882283,  402.41558648],
        [ 192.50462233,  408.31800086,   81.66016443],
        [  64.15373494,   34.96971099,  446.55362458]],

       [[ 376.55003794,   70.09514697,  242.08947306],
        [ 194.86207829,  379.90969257,  439.47043484],
        [ 102.99922513,   98.57769429,  415.5059223 ],
        [ 464.65318671,  223.60061654,  417.52758666],
        [  53.68383153,  205.32517075,  299.83858164]],

       [[ 364.80957874,   14.26150931,  264.01568428],
        [ 295.75617954,  107.52678922,   87.89830525],
        [  57.90617865,  409.54132373,   54.36940482],
        [ 217.35951975,  345.7892723 ,  301.07031811],
        [ 295.98999071,   27.17772152,  182.58776469]],

       [[ …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy

5
推荐指数
1
解决办法
396
查看次数

使用 python selenium 对元素进行屏幕截图显示屏幕错误部分的图像

我正在尝试使用此问题答案中的代码来截取网页上特定元素的屏幕截图当我几天前测试它时,这最初是有效的,但现在它产生的区域始终位于目标元素的上方和左侧。

原始代码的输出对调试没有多大帮助,因此我将其更改为在该区域周围绘制一个矩形,而不是裁剪它。

例子:

from selenium import webdriver
from PIL import Image, ImageDraw
from io import BytesIO

browser = webdriver.Chrome()
browser.get('http://www.google.com')

logo = browser.find_element_by_id('hplogo') #id of 'Google' image

location = logo.location
size = logo.size

im = Image.open(BytesIO(browser.get_screenshot_as_png()))

draw = ImageDraw.Draw(im)
draw.rectangle(((location['x'], location['y']), (location['x'] + size['width'], location['y'] + size['height'])), outline='black')

im.show()
browser.quit()
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述

绘制的框似乎具有正确的长宽比,但位置和大小不正确。如果您能解释导致此问题的原因以及解决此问题的任何帮助,我将不胜感激。

python selenium python-imaging-library

5
推荐指数
1
解决办法
2080
查看次数

打印所有变量及其值

这个问题已被提出了很多问题,我尝试过每一个遇到的解决方案,但都没有取得任何成功.我正在尝试使用以下两行打印出每个变量及其值.

for name, value in globals():
    print(name, value)
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误:Too many values to unpack 当我运行时:

for name in globals():
    print(name)
Run Code Online (Sandbox Code Playgroud)

我只得到变量的名称.任何帮助,将不胜感激.

python

4
推荐指数
1
解决办法
1万
查看次数

在两个单独的列表上使用相同的列表推导

这感觉就像一个简单的问题,但我无法弄清楚,我无法在任何地方找到答案.

在一行中,如何在两个不同的列表中使用两个相同的列表推导,并将结果作为两个单独的列表返回?

我想这样做:

listx = [x for x in listx if x != None]
listy = [y for y in listy if y != None]
Run Code Online (Sandbox Code Playgroud)

有没有办法在一行中做到这一点?也许使用map()或列表理解?

python

4
推荐指数
1
解决办法
123
查看次数

返回输入的每个特征的计数数组

我有一个整数标签数组,我想确定每个标签有多少个,并将这些值存储在与输入大小相同的数组中。这可以通过以下循环来完成:

def counter(labels):
    sizes = numpy.zeros(labels.shape)
    for num in numpy.unique(labels):
        mask = labels == num
        sizes[mask] = numpy.count_nonzero(mask)
return sizes
Run Code Online (Sandbox Code Playgroud)

带输入:

array = numpy.array([
       [0, 1, 2, 3],
       [0, 1, 1, 3],
       [3, 1, 3, 1]])
Run Code Online (Sandbox Code Playgroud)

counter() 返回:

array([[ 2.,  5.,  1.,  4.],
       [ 2.,  5.,  5.,  4.],
       [ 4.,  5.,  4.,  5.]])
Run Code Online (Sandbox Code Playgroud)

然而,对于具有许多独特标签的大型阵列,在我的例子中为 60,000,这需要相当长的时间。这是复杂算法的第一步,我不能在这一步上花费超过 30 秒。是否已经存在可以完成此操作的功能?如果没有,我如何加速现有循环?

python arrays numpy

3
推荐指数
1
解决办法
113
查看次数

编写一个可在matlab中读取的3d numpy数组

我正在尝试将3D numpy数组保存到我的磁盘中,以便稍后我可以在matlab中读取它.我在使用numpy.savetxt()3D数组时遇到了一些困难,所以我的解决方案是首先使用以下代码将其转换为1D数组:

import numpy

array = numpy.array([[0, 1, 2, 3],
       [0, 1, 1, 3],
       [3, 1, 3, 1]])

ndarray = numpy.dstack((array, array, array))

darray = ndarray.reshape(36,1)

numpy.savetxt('test.txt', darray, fmt = '%i')
Run Code Online (Sandbox Code Playgroud)

然后在matlab中可以使用以下代码读取它:

file = fopen('test.txt')
array = fscanf(file, '%f')
Run Code Online (Sandbox Code Playgroud)

我现在的问题是将其转换回原始形状.使用reshape(array, 3,4,3)以下产量:

ans(:,:,1) =

     0     1     2     3
     0     1     2     3
     0     1     2     3


ans(:,:,2) =

     0     1     1     3
     0     1     1     3
     0     1     1     3


ans(:,:,3) =

     3     1     3     1
     3 …
Run Code Online (Sandbox Code Playgroud)

python arrays matlab numpy

2
推荐指数
1
解决办法
79
查看次数

Python 请求:如何处理状态码 304

我正在尝试使用requestsbs4从网站获取信息,但收到状态代码 304 并且没有来自request.get(). 我已经阅读并了解此代码表明资源已在我的缓存中。我如何从我的缓存访问资源,或者最好清除我的缓存以便我可以接收新资源?

我试过添加以下标题:headers={'Cache-Control': 'no-cache'}requests.get()但仍然有同样的问题。

此外,我已经研究了该requests-cache模块,但不清楚如何或是否可以使用它来解决问题。

代码:

import requests

r = requests.get('https://smsreceivefree.com/')

print(r.status_code)
print(r.content)
Run Code Online (Sandbox Code Playgroud)

输出:

304
b''
Run Code Online (Sandbox Code Playgroud)

python python-requests

-1
推荐指数
1
解决办法
2693
查看次数