首页 > 解决方案 > 如何使用 Python 抓取特定字段,如下面的 HTML 代码所示?

问题描述

这是电子邮件字段的 HTML 代码:

<div class="forge-form-group forge-col-12"><label class="">Email</label><input class="forge-form-control" data-fieldname="email" name="email" type="email" value=""><small class="forge-form-text forge-text-muted">Haven't signed up?<a class="forge-ml-2" href="#">Create an account</a></small></div>
<input class="forge-form-control" data-fieldname="email" name="email" type="email" value="">

这是我的 Python 代码:

email_cell=driver.find_element_by_xpath("//div[@class='forge-form-group forge-col-12']//input[@class='forge-form-control']")

但问题是密码也有一个相同的字段。它不同于相当于密码的数据字段名称。这也是 HTML 代码片段:

<div class="forge-form-group forge-col-12"><label class="">Password</label><a class="forge-float-right" href="#">Forgot password?</a><input class="forge-form-control" data-fieldname="password" name="password" type="password" value=""></div>

现在我对如何单独访问这两个字段感到非常困惑。我正在自动化的页面可以在这里找到: https ://moz.com/login 。

标签: pythonseleniumselenium-webdriverweb-scrapingselenium-chromedriver

解决方案


您的示例中使用的 XPath 定位两个字段——电子邮件和密码。这不适用于您的代码,因为您只是试图找到电子邮件。XPath 中的//表示法意味着该路径正在定位任何字段——电子邮件和密码恰好具有相同的包含divinput元素,并且与class您使用的名称相同。我们需要使用唯一的属性来定位每个元素——在这种情况下,我们可以使用该data-fieldname属性来获取正确的字段。

还建议WebDriverWait在电子邮件字段上调用,以便在尝试定位并将密钥发送到元素之前给页面足够的时间来加载。

下面的代码示例应该让您了解如何使用这些元素属性。这是在您提供的页面上输入电子邮件、密码并单击登录的示例——我已在本地成功运行:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# add the above imports


driver.get("https://www.moz.com/login")

# wait for email field to exist
email_cell = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//input[@data-fieldname='email']")))

# send keys to email field
email_cell.send_keys("myemail")

# locate password and send keys
password_cell = driver.find_element_by_xpath("//input[@data-fieldname='password']").send_keys("mypassword")

# click log in
driver.find_element_by_xpath("//input[@value='Log in']").click()

推荐阅读