硒元素未附加到页面文档

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 而不是 tr1),然后将其添加到列表中。

我的代码遍历页面,但在某个时刻停止工作(即使我添加 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 可能有点臃肿。有时您需要 full-fledged 浏览器,但这不是其中之一。我会推荐请求和漂亮的汤(它更适合提出大量请求。)我很感激你 运行 javascript 获得更多物品(虽然对我来说,重新加载按钮不是' t doing anything) 在那种情况下,这是必要的。但是,我查看了该网站,发现您想要的数据可以 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)