如何使用硒获取更改网站的页面源?

How to get a page source of changed website with selenium?

提问人:user_bktv_all3103 提问时间:7/30/2023 最后编辑:Ajeet Vermauser_bktv_all3103 更新时间:7/30/2023 访问量:31

问:

我需要在更改页面后获取页面的源代码,我向页面发送请求,然后页面在我的浏览器中打开,我用手选择一些数据,然后出现一个包含必要数据的表格,经过所有这些操作后,我该如何获取此表格或更改后获取整页代码

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

links=['https://priem.gubkin.ru/#/page/enrollment']
s=Service(executable_path='D:\\university\\geckodriver.exe')

driver = webdriver.Firefox(service=s)
try:
    driver.maximize_window()

    for i in range(0,len(links)):
        driver.get(links[i])
        # time.sleep(25)

        element = WebDriverWait(driver, 30).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "tbody")))

        with open('GUBKINA.html', 'w') as file:
            file.write(element)

except Exception as ex:
    print(ex)
finally:
    driver.close()
    driver.quit()

我试图在等待的帮助下获取此表并找到该表的类,但是程序找不到此元素并写入nosuchelenterror等

python 解析 selenium-webdriver 网页抓取 beautifulsoup

评论


答:

0赞 Ned Hulton 7/30/2023 #1

我认为您的问题是您想要的链接在 iFrame 中。尝试这样的事情:

iframe = driver.find_element(By.XPATH, "//iframe") #find the iframe
driver.switch_to.frame(iframe) # go into it

items = driver.find_elements(By.XPATH, "//span") # do stuff
for item in items:
    print(unidecode(item.text))

driver.switch_to.default_content() # exit the iframe

我找不到任何具有“tbody”类的元素,但该类的 CSS 在网站上。上面的代码以 unicode 格式打印以下内容:

Spisok abiturientov
Forma obucheniia
Forma obucheniia
Forma obucheniia

评论

0赞 user_bktv_all3103 7/30/2023
我已更改为“element = WebDriverWait(driver, 50).until( EC.presence_of_element_located((By.XPATH,'/html/body/app-root/div/home/mat-card/div[2]'))); ”,但它也不起作用,我看到表格不在 iframe 中,写css_selector是错误的,我写它是因为测试了这段代码,忘记返回元素的正常查找
0赞 Ned Hulton 7/30/2023
这个路径不存在:html/body/app-root/div/home/mat-card/div[2] 至少在我这边。
0赞 Ned Hulton 7/30/2023
此路径确实存在,但它位于 iframe 中:html/body/app-root/div/home
0赞 Andrej Kesely 7/30/2023 #2

我建议另一种方法:使用他们的 Ajax API(他们以 Json 形式获取表数据的 URL):

import requests
import pandas as pd

url = 'https://transfer.priem.gubkin.ru/abiturients_list/api/api.php'

params = {
    "act": "search",
    "method": "get",
    "educationTypeId": "6",
    "contestGroupId": "263",
}

data = requests.get(url, params=params).json()
df = pd.DataFrame(data["data"]).explode("ballsBySubjects")
df = pd.concat(
    [df, df.pop("ballsBySubjects").apply(pd.Series).add_prefix("bbs_")], axis=1
)

print(df)

指纹:

   position           snils   fio  originalExistence originalType individualAchievementsBalls totalBalls  needHostel  priority entranceBalls benefit  isLastPerson orders_before       bbs_name  bbs_id bbs_ball  bbs_priority
0         1  173-112-079 27  None              False                                     None       None        True         2          None                 False                Специальность      17     None             1
1         2  134-581-746 69  None              False                                     None       None        True         1          None                 False                Специальность      17     None             1
2         3  174-629-198 02  None              False                                     None       None       False         2          None                 False                Специальность      17     None             1

切换到“网络”选项卡并填写表单时,在 Web 开发人员工具中找到的参数(屏幕截图):

enter image description here