在 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
我想找到一种在这些字段中输入 name
和 email
后按下按钮的方法。
我已经设法在所有页面中输入 name
和 email
,但无故无法按下按钮。要么按钮更多,要么 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
。如果您将它们替换为您想要订阅的内容并重复此请求,则您可能已经订阅了其他人。我说可能,因为还有 u
和 id
参数,其中一个是对邮件列表的引用,但另一个可能是指用户会话。需要进行实验才能弄清楚到底发生了什么。
您需要对每个订阅页面进行所有这些修改,这可能可行也可能不可行。在 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
个元素。
假设我有以下 3 个链接(虽然还有更多):
https://rapidevolution.clickfunnels.com/jv-page-2
http://Listhubpro.com/jv
http://viralautopilotfunnels.com/jv
我想找到一种在这些字段中输入 name
和 email
后按下按钮的方法。
我已经设法在所有页面中输入 name
和 email
,但无故无法按下按钮。要么按钮更多,要么 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
。如果您将它们替换为您想要订阅的内容并重复此请求,则您可能已经订阅了其他人。我说可能,因为还有 u
和 id
参数,其中一个是对邮件列表的引用,但另一个可能是指用户会话。需要进行实验才能弄清楚到底发生了什么。
您需要对每个订阅页面进行所有这些修改,这可能可行也可能不可行。在 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
个元素。