尝试使用Selenium通过xpath选择元素但是收到错误“无法找到元素”

时间:2016-12-16 21:20:37

标签: python selenium xpath

我正在尝试抓取给定Instagram用户的以下列表。这需要使用Selenium导航到用户的Instagram页面,然后单击“关注”。但是,我似乎无法点击Selenium的“关注”按钮。

Use Single Transaction

然而,这导致driver = webdriver.Chrome() url = 'https://www.instagram.com/beforeeesunrise/' driver.get(url) driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/header/div[2]/ul/li[3]/a').click() 。我从html复制了xpath,尝试使用类名,部分链接和完整链接,似乎无法让它工作!我还确保上面的xpath包含带有“click”事件监听器的元素。

更新:通过登录我能够获得上述信息。但是(!),现在我无法得到“跟随”的结果列表。当我点击带有驱动程序的按钮时,html不包含您在Instagram上看到的弹出对话框中的信息。我的目标是让所有用户都遵循给定的用户名。

3 个答案:

答案 0 :(得分:1)

尝试使用其他XPath。我已经确认这在页面上是唯一的。

driver.find_element_by_xpath("//a[contains(.,'following')]")

答案 1 :(得分:1)

确保使用正确的X路径。

使用以下链接获取完美的X路径以访问网络元素,然后尝试。

Selenium Command

希望这有助于解决问题!

答案 2 :(得分:0)

从网页抓取的角度来看,selenium的主要目标不是提供丰富的功能,而是在页面上查找元素,因此更好的选择是将此任务委派给特定工具,像BeautifulSoup。在我们找到我们正在寻找的内容之后,我们可以要求selenium与该元素进行互动。

seleniumBeautifulSoup之间的桥梁将是我发现here之下的这个惊人的功能。该函数获取一个BeautifulSoup元素,并生成一个我们可以在selenium上使用的唯一XPATH。

import os
import re
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import itertools

def xpath_soup(element):
    """
    Generate xpath of soup element
    :param element: bs4 text or node
    :return: xpath as string
    """
    components = []
    child = element if element.name else element.parent
    for parent in child.parents:
        """
        @type parent: bs4.element.Tag
        """
        previous = itertools.islice(parent.children, 0, parent.contents.index(child))
        xpath_tag = child.name
        xpath_index = sum(1 for i in previous if i.name == xpath_tag) + 1
        components.append(xpath_tag if xpath_index == 1 else '%s[%d]' % (xpath_tag, xpath_index))
        child = parent
    components.reverse()
    return '/%s' % '/'.join(components)


driver = webdriver.Chrome(executable_path=YOUR_CHROMEDRIVER_PATH)
driver.get(url = 'https://www.instagram.com/beforeeesunrise/')
source = driver.page_source

soup = bs(source, 'html.parser')
button = soup.find('button', text=re.compile(r'Follow'))
xpath_for_the_button = xpath_soup(button)

elm = driver.find_element_by_xpath(xpath_for_the_button)
elm.click()

......并且有效!

(但您需要编写一些代码才能使用帐户登录)

enter image description here