【问题标题】:Selenium - click on anchor link without class within a div with a classnameSelenium - 在具有类名的 div 中单击没有类的锚链接
【发布时间】:2017-02-12 09:46:21
【问题描述】:

我有一个要从中抓取数据的网址。我正在使用硒打开该网站。我想访问 heading 类中的页面并从此页面获取信息。如果没有类名,我不确定如何单击 div 中的链接。它给了我以下错误信息:

无法定位元素 a

html如下所示

<div class="heading">
    <a href="....">Text here</a>
</div>

<div class="heading">
    <a href="....">Text here</a>
</div>

Python

import time
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
from selenium.common.exceptions import TimeoutException

 def init_driver():
    driver = webdriver.Firefox()
    driver.wait = WebDriverWait(driver, 5)
    return driver


def lookup(driver, query):
    driver.get("http://www.sportbirmingham.org/directory?sport=&radius=15&postcode=B16+8QG&submit=Search")
    try:
        parentElement = driver.find_elements_by_class_name("heading")
        print parentElement
        elementList = parentElement.find_element_by_tag_name("a")
        print elementList
    except TimeoutException:
        print("not found")


if __name__ == "__main__":
    driver = init_driver()
    lookup(driver, "Selenium")
    time.sleep(5)
    driver.quit()

【问题讨论】:

  • 你有它的id吗?
  • @omri_saadon 它没有,只有一个类名
  • 那么您的CSS 选择器.heading a 有什么问题?你有例外吗?

标签: python selenium


【解决方案1】:

在您的代码中,您尝试调用parentElement.find_element_by_tag_name('a')parentElement 是一个列表,因此您不能应用find_element_by_tag_name() 方法。试试下面的代码:

Python 3.6

def lookup(driver, query):
    driver.get("http://www.sportbirmingham.org/directory?sport=&radius=15&postcode=B16+8QG&submit=Search")
    try:
        [print(link.text) for link in driver.find_elements_by_xpath('//h2[@class="heading"]/a')]
    except TimeoutException:
        print("not found")

Python 2.7

def lookup(driver, query):
    driver.get("http://www.sportbirmingham.org/directory?sport=&radius=15&postcode=B16+8QG&submit=Search")
    try:
        for link in driver.find_elements_by_xpath('//h2[@class="heading"]/a'):
            print link.text
    except TimeoutException:
        print "not found"

如果你想点击确切的链接,你可以使用:

driver.find_element_by_link_text('Sport Birmingham').click()

【讨论】:

  • [print(link.text) for link in driver.find_elements_by_xpath('//h2[@class="heading"]/a')] ^ SyntaxError: invalid syntax
  • 嗯...你用Python 2.x吗?
  • Python 2.7.13
  • 最后一个问题,如果你点击每个链接,你能看到有一个电子邮件地址吗?是否有可能在每个链接点击后得到这个?
  • 试试这个driver.find_element_by_xpath('//div[@id="widget-contact"]//a').get_attribute('href')
【解决方案2】:

你想得到heading类下的内部标签,你应该用&gt;替换空格

改变这个:

button = driver.wait.until(EC.element_to_be_clickable(
            (By.css, ".heading a")))

收件人:

button = driver.wait.until(EC.element_to_be_clickable(
            (By.css, ".heading>a")))

【讨论】:

  • By.css 无法正常工作,因此稍微更新了问题。
  • 这没用? driver.find_element_by_css_selector('div.heading&gt;a')
【解决方案3】:

您试图在包含heading 类的第一个元素中找到a 标记元素。你需要在这行之后:

parentElement = driver.find_elements_by_class_name("heading")

遍历结果(即 parentElements)并获取其下的a 标签,然后获取其文本。通过查看您的 URL,第一个 heading div 下没有 a,因此出现错误。

编辑:循环遍历元素(警告:我知道一点蟒蛇)

for a_element in parentElements:
    if (a_element.find_elements_by_tag_name('a').count > 0)
        a_text = a_element.find_element_by_tag_name('a').text

【讨论】:

  • 我认为您的某些答案丢失了。如果第一个标题下面没有标签,我怎么能忽略它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多