如何将更新的页面内容传递给另一个函数?
Posted
技术标签:
【中文标题】如何将更新的页面内容传递给另一个函数?【英文标题】:How do I pass the updated page content to another function? 【发布时间】:2020-04-04 16:55:56 【问题描述】:我有一些 selenium-webdriver 的代码,如下所示:
base_url = 'http://wsprnet.org/drupal/wsprnet/spotquery'
driver = webdriver.Chrome()
driver.get(base_url)
并且在输入登录名和密码后,页面会在这段代码之后更新:
btn_elem_upd = driver.find_element_by_id('edit-submit').click()
接下来需要将更新后的页面转移到另一个函数中,像这样:
url = "Here need transfer the new updated page"
res = requests.get(url)
doc = lxml.html.fromstring(res.text)
如何做到这一点?有什么选择? 更新,如果我这样写,代码可以工作:
new_source = 'http://wsprnet.org/drupal/wsprnet/spots'
res = requests.get(new_source)
doc = lxml.html.fromstring(res.text)
cols = []
cols.append(doc.xpath('//table/tr[1]/node()/text()')[0])
for item in doc.xpath('//table/tr/th'):
typ = str(type(item.getnext()))
if not 'NoneType' in typ:
cols.append(item.getnext().text)
inf = []
for item in doc.xpath('//table//tr//td'):
inf.append(item.text.replace('\\xa02', '').strip())
rows = [inf[x:x+len(cols)] for x in range(0, len(inf), len(cols))]
with open("output.csv", "w", newline='') as f:
writer = csv.writer(f)
writer.writerow(cols)
for l in rows:
writer.writerow(l)
如果我重写:
doc = lxml.html.fromstring(driver.page_source)
cols = []
cols.append(doc.xpath('//table/tr[1]/node()/text()')[0])
代码无法正常工作并出现错误:
cols.append(doc.xpath('//table/tr[1]/node()/text()')[0])
IndexError: list index out of range
【问题讨论】:
登录后是要URL
吗?
@TekNath 是的,但在登录 url = wsprnet.org/drupal/wsprnet/spotquery 之前和登录 url = wsprnet.org/drupal/wsprnet/spotquery 之后。但页面内容不同。
点击submit
按钮后,如果你使用driver.page_source
,你会得到HTML。这就是你想要的?
@KunduK 是的,我尝试这种方式。但是如果我写 url = driver.page_source ,下一行会抛出一个错误 - res = requests.get(url)。我需要重写代码以便下一个构造起作用: res = requests.get(url) doc = lxml.html.fromstring(res.text)
您可以在登录后发布您的 html 以及您所追求的价值吗?
【参考方案1】:
根据我们的讨论,您可以使用 pandas 库来读取表信息并加载到 csv 文件中。
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
import pandas as pd
driver = webdriver.Chrome()
driver.get("http://wsprnet.org/drupal/wsprnet/spotquery")
login = driver.find_element_by_id('edit-name')
password = driver.find_element_by_id('edit-pass')
btn_elem_log = driver.find_element_by_id('edit-submit--2')
login.send_keys('username')
password.send_keys('password')
btn_elem_log.click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"edit-call"))).send_keys("searchval")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"edit-excludespecial"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"edit-submit"))).click()
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.TAG_NAME,"table")))
page=driver.page_source
df=pd.read_html(page)
df[0].to_csv("csvfile.csv",index=False)
【讨论】:
【参考方案2】:使用在您的 selenium 代码中运行的 javascript 重定向到该新页面。 Selenium 支持这一点。所以你可以试试
driver.execute_script(f"window.location.replace('new_url');")
这应该将您的网络驱动程序发送到新 URL
如果您要在不同的功能中运行它,您可能想要打开这是一个新标签,以防万一,在新标签中打开您可以使用这个:
driver.execute_script(f"window.open('new_url');")
这将在新标签而不是当前活动标签中打开 URL,尽管这也意味着您必须在标签之间切换才能访问不同的网页,并且您可能希望在使用它们后关闭标签或它可能会变得混乱。
【讨论】:
不,它不起作用。网址不变,内容在变化以上是关于如何将更新的页面内容传递给另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章
REACTJS 和 API 将 Api 的值传递给另一个页面