在 python 中使用 xpath 在所有 css 选择器中搜索整个页面中的特定词

Search for specific word in the whole page in all css selectors using xpath in python

假设我有以下 3 个链接(虽然还有更多):

https://rapidevolution.clickfunnels.com/jv-page-2  
http://Listhubpro.com/jv  
http://viralautopilotfunnels.com/jv

我想找到一种在这些字段中输入 nameemail 后按下按钮的方法。

我已经设法在所有页面中输入 nameemail,但无故无法按下按钮。要么按钮更多,要么 css 选择器因页面而异。

到目前为止我的代码:

lista = [
    'https://rapidevolution.clickfunnels.com/jv-page-2',
    'http://Listhubpro.com/jv',
    'http://viralautopilotfunnels.com/jv',
]

for url in lista:
    not_found = False
    name_required = True
    email_required = True
    button_required = True

    driver.get(url)
    time.sleep(2)

    try:
        name_box = driver.find_element_by_xpath("//​input​[@*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'name')]]")
        name_box.click()
        name_box.clear()
        name_box.send_keys('MyName')
    except:
        not_found = True

    try:
        email_box = driver.find_element_by_xpath("//​input​[@*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'email')]]")
        email_box.click()
        email_box.clear()
        email_box.send_keys('email@yahoo.com')
    except:
        not_found = True

    if not_found:
        print "here"
        for element in driver.find_elements_by_xpath("//input[@type='text']"):
            if name_required:
                try:
                    name_box = element.find_element_by_xpath(".[@*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'name')]]")
                    name_box.click()
                    name_box.clear()
                    name_box.send_keys('MyName')
                    name_required = False
                    continue
                except:
                    pass

            if email_required:
                try:
                    email_box = element.find_element_by_xpath(".[@*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'email')]]")
                    email_box.click()
                    email_box.clear()
                    email_box.send_keys('email@yahoo.com')
                    email_box.send_keys(Keys.Enter)
                    email_required = False
                    break
                except:
                    pass

            if (not name_required) and (not email_required) and (not button_required):
                break

    for element1 in driver.find_element_by_xpath("//​div​[@*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'button')]]"):
        if button_required:
            try:
                button = element1.find_element_by_xpath("//*[@type='submit']").click()
                button.click()
                button.send_keys(Keys.ENTER)
                button_required = False
                continue
            except:
                try:
                    button1 = element1.find_element_by_xpath(".[@*[contains(., 'button')]]").click()
                    button1.click()
                    button1.send_keys(Keys.ENTER)
                    button_required = False
                except:
                    pass

    time.sleep(2)
    print button_required

没有完全回答你的问题,但如果你想注册邮件列表,模仿对注册你的服务器的请求可能更容易。我查看了第一个 link,按下按钮时发出了一个 HTTP Post 请求,其中包含刚刚输入的凭据。您可以使用 requests 库来重建该请求。

编辑:更多细节

在第二个 link 中,我实际上被重定向到另一个页面,我必须在该页面再次输入数据。然后,按下按钮后,我从浏览器调试器中看到发送了以下请求(作为 curl 命令)。

curl 'http://gopartnerpro.us11.list-manage.com/subscribe/post' -H 'Host: gopartnerpro.us11.list-manage.com' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: nl,en-US;q=0.7,en;q=0.3' --compressed -H 'Referer: http://gopartnerpro.us11.list-manage1.com/subscribe?u=7296d4e9339f32fccc465e451&id=2783407c84' -H 'Connection: keep-alive' --data 'u=7296d4e9339f32fccc465e451&id=2783407c84&MERGE1=Gib&MERGE0=bla%40gmail.com&b_7296d4e9339f32fccc465e451_2783407c84=&submit=Subscribe+to+list'

您可以看到我的名字是 Gib,我的电子邮件地址是 bla@gmail.com。如果您将它们替换为您想要订阅的内容并重复此请求,则您可能已经订阅了其他人。我说可能,因为还有 uid 参数,其中一个是对邮件列表的引用,但另一个可能是指用户会话。需要进行实验才能弄清楚到底发生了什么。

您需要对每个订阅页面进行所有这些修改,这可能可行也可能不可行。在 return 中,您最终会得到一种相对紧凑且稳健的订阅方式。

在代码第 18 行、第 26 行和第 62 行的 XPath 表达式中,您有 Unicode 零宽度 space (U+200B) 字符。你应该删除那些。

如果您将代码编辑器配置为显示非打印字符,您会看到第 18 行的代码如下所示:

name_box = driver.find_element_by_xpath("//<200b>input<200b>[@*[contains…

其中 <200b> 是 Unicode 零宽度 space 字符。

第 26 行和第 62 行的 XPath 表达式中有同样的事情。所以那些 XPath 表达式永远不会匹配任何东西。请删除那些零宽度 space 字符并查看您的代码是否按预期方式工作。

就问题中列出的文档而言,您的 XPath 表达式 //div[@*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'button')]] 按预期与 https://rapidevolution.clickfunnels.com/jv-page-2 一起工作。它 returns 4 div 个元素。