繁体   English   中英

Selenium 元素未附加到页面文档

[英]Selenium element is not attached to the page document

我正在尝试使用 Python 抓取此特定站点: https://www.milanofinanza.it/quotazioni/ricerca/listino-completo-2ae?refresh_cens

我需要获取所有 isin 代码和名称。 我的想法是将它们全部放在 2 个单独的列表中,为此我尝试获取整个列(通过将 Xpath 更改为 tr 而不是 tr 1 ),然后将其添加到列表中。

我的代码遍历页面,但在某个时刻停止工作(即使我添加time.sleep(10)以确保代码在网站完全加载时开始抓取)。

我的代码如下所示:

wd = wd.Chrome()
wd.implicitly_wait(10)

wd.get('https://www.milanofinanza.it/quotazioni/ricerca/listino-completo-2ae')

company_name = []
isin = []
for n in range(0,15):
time.sleep(10)
tickers = wd.find_elements(By.XPATH,"//*[@id='mainbox']/div[2]/div[2]/div[4]/div/table/tbody/tr/td[1]")
isin = wd.find_elements(By.XPATH,"/html/body/div[3]/div/div/div/main/div[1]/div[2]/div[2]/div[4]/div/table/tbody/tr/td[10]/span")
for el in tickers:
    company_name.append(el.text)
for i in isin:
    isin.append(i.text)

l=wd.find_element(By.XPATH,"/html/body/div[2]/div/div/div/main/div[1]/div[2]/div[2]/div[4]/div/div[1]/div/button[4]")
wd.execute_script("arguments[0].click();",l)
print("data collected")

我怎么解决这个问题? 这里有一些图片可以更好地理解:

名称:

在此处输入图像描述

伊辛:

在此处输入图像描述

我的第一直觉是告诉你 selenium 可能对于你正在做的事情来说有点臃肿。 有时您需要功能齐全的浏览器,但这不是其中之一。 我会推荐请求和漂亮的汤(它更适合做一堆请求。)我很感激你运行 javascript 来获得更多的项目(虽然对我来说,重新加载按钮没有做任何事情)在那种情况下,有必要。 但是,我查看了该网站,发现您想要的数据可以 JSON 格式(因此不需要 BS)和简单的获取请求来检索。

import requests

data = requests.get("https://www.milanofinanza.it/Mercati/GetDataTabelle?alias=&campoOrdinamento=0002&numElem=30&ordinamento=asc&page=4&url=listino-completo-2ae?refresh_cens")
print(data.text)

或者这样做,这样更容易调整参数:

def pack(**kwargs):
    return kwargs
data2 = requests.get("https://www.milanofinanza.it/Mercati/GetDataTabelle", params=pack(alias="",campoOrdinamento="0002",numElem=30,ordinamento="asc",page=4,url="listino-completo-2ae",refresh_cens=""))

我没时间了; 如果我得到错误的数据,LMK,我会更正答案。

抱歉,我看不到您现有的代码是如何工作的。
在我这边,我看到您正在使用的isin器不匹配任何内容。
我在这里更新了定位器。
我建议您永远不要使用自动创建的定位器。
此外,您在此处提供的代码缺少缩进。 我希望您的实际代码有适当的缩进。
请看看这是否会更好:

wd = wd.Chrome()

wd.get('https://www.milanofinanza.it/quotazioni/ricerca/listino-completo-2ae')

company_name = []
isin = []
for n in range(0,15):
    time.sleep(10)
    tickers = wd.find_elements(By.XPATH,"//table[contains(@class,'celled')]//tbody//tr//td[1]")
    isins = wd.find_elements(By.XPATH,"//table[contains(@class,'celled')]//tbody//tr//td[10]")
    for el in tickers:
        company_name.append(el.text)
    for is_el in isins:
        isin.append(is_el.text)
 
    l=wd.find_element(By.XPATH,'//nav//button[@ng-click="getDataTableNextClick()"]')
    wd.execute_script("arguments[0].click();",l)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM