Selenium - 在带有类名的div中单击没有类的锚链接

时间:2017-02-12 09:46:22

标签: python selenium

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

  

无法找到元素

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()

3 个答案:

答案 0 :(得分:0)

您想要访问heading类下的内部标记,您应该用>替换空格

改变这个:

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")))

答案 1 :(得分:0)

在您的代码中,您尝试拨打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()

答案 2 :(得分:0)

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

parentElement = driver.find_elements_by_class_name("heading")

循环结果(即parentElement s )并获取其下的a标记,然后获取它的文本。通过查看您的网址,第一个heading div下面没有a,因此出错。

编辑:循环遍历元素(警告:我知道小python)

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