【问题标题】: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 以及您所追求的价值吗?

标签: python selenium selenium-webdriver beautifulsoup python-requests


【解决方案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,尽管这也意味着您必须在标签之间切换才能访问不同的网页,并且您可能希望在使用它们后关闭标签或它可能会变得混乱。

    【讨论】:

    • 不,它不起作用。网址不变,内容在变化
    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2015-10-20
    相关资源
    最近更新 更多