【问题标题】:How can I print email address using Selenium Python如何使用 Selenium Python 打印电子邮件地址
【发布时间】:2021-02-06 11:18:20
【问题描述】:
<div id="MainCopy_ctl13_presentJob_EmailAddressPanel">
    <a id="MainCopy_ctl13_presentJob_EmailAddress" href="mailto:dburse@bjcta.org">xyzmmm@tccp.org</a>
</div>

我尝试过使用

email = browser.find_elements_by_xpath('//div[@id="MainCopy_ctl13_presentJob_EmailAddress"]//a').text
print(email)

但我没有得到结果。

【问题讨论】:

  • browser.find_elements_by_xpath 为什么使用元素使用 browser.find_element_by_xpath 代替

标签: python selenium-webdriver xpath css-selectors webdriverwait


【解决方案1】:

a 标签内的 email 是 a 标签的 href,所以这样做:

使用硒:

from selenium import webdriver
    
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")


a_tag = driver.find_element_by_id('MainCopy_ctl13_presentJob_EmailAddress')
mail_link = a_tag.get_attribute("href")
mail_addrs = mail_link.split(':')[1]
print(mail_addrs)

使用 Beautifulsoup:

from bs4 import BeautifulSoup
    
content=""" 
<div id="MainCopy_ctl13_presentJob_EmailAddressPanel">
    a id="MainCopy_ctl13_presentJob_EmailAddress" href="mailto:dburse@bjcta.org">xyzmmm@tccp.org</a>
</div>"""
soup = BeautifulSoup(content)
a_tag = soup.find(id='MainCopy_ctl13_presentJob_EmailAddress')
mail_link = a_tag.attrs['href']
mail_addrs = mail_link.split(':')[1]
print(mail_addrs)

【讨论】:

  • 在内容的地方,可以使用 xpath 存储 ot get element by id。我是使用 xpath 的详细信息
  • 所以您想查找电子邮件但使用 xpath 而不是 id?
  • 我正在使用 browser.find_element_by_id('MainCopy_ctl13_presentJob_EmailAddress')
  • 我们不需要使用内容变量
【解决方案2】:

文本仅打印可见文本,对不在显示端口的文本使用 textContent 属性:

email = browser.find_element_by_xpath('//div[@id="MainCopy_ctl13_presentJob_EmailAddressPanel"]//a').get_attribute("textContent")
print(email)

【讨论】:

  • AttributeError: 'list' 对象没有属性 'get_attribute'
  • @vamsi 只是将其更改为元素更新了代码,为什么要使用元素
  • email = browser.find_element_by_xpath('//div[@id="MainCopy_ctl13_presentJob_EmailAddress"]//a').get_attribute('textContent')
  • 文件 "C:\Users\yyy\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py",第 394 行,在 find_element_by_xpath 中返回self.find_element(by=By.XPATH
  • 是不是找不到元素?
【解决方案3】:

元素已经存在了吗?或者在元素被 Selenium 加载之前执行的代码?

考虑使用等待:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

【讨论】:

  • 元素存在,只是我们需要打印。
  • 我用过 chome 网络驱动
【解决方案4】:

您使用的id属性,即MainCopy_ctl13_presentJob_EmailAddress属于&lt;a&gt;标签而不是&lt;div&gt;

要打印电子邮件地址,您可以使用以下任一Locator Strategies

  • 使用css_selectorget_attribute()

    print(driver.find_element(By.CSS_SELECTOR, "a#MainCopy_ctl13_presentJob_EmailAddress").get_attribute("innerHTML"))
    
  • 使用xpathtext属性:

    print(driver.find_element(By.XPATH, "//a[@id='MainCopy_ctl13_presentJob_EmailAddress']").text)
    

理想情况下,您需要为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTORtext属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a#MainCopy_ctl13_presentJob_EmailAddress"))).text)
    
  • 使用XPATHget_attribute()

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[@id='MainCopy_ctl13_presentJob_EmailAddress']"))).get_attribute("innerHTML"))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

  • 如何返回空结果 例如:如果xpath没有数据就没有数据
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2023-03-23
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多