【问题标题】:How to click class of class with Selenium, Python?(Crawling microsoft website)如何使用 Selenium、Python 单击类的类?(爬取微软网站)
【发布时间】:2019-08-05 01:50:24
【问题描述】:

我想爬取微软网站来删除我的照片。

我想点击所有照片(最多 100 张照片)然后点击删除按钮并重复差不多 4-5 次。

“ItemCheck”类是选择照片的按钮。

但是还有另一个与特定照片无关的“ItemCheck”类。

两个“ItemCheck”类的区别在于祖先。

所以我想先找到“List-cell”类,然后在“List-cell”类中找到“ItemCheck”类。

我该如何解决这个问题? 我使用 pythone 和 sublime。

我尝试使用“find_elements_by_css_selector”作为代码,但“行”是空的! =>[ ]

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.by import By

EMAILFIELD = (By.ID, "i0116")
PASSWORDFIELD = (By.ID, "i0118")
NEXTBUTTON = (By.ID, "idSIButton9")

browser = webdriver.Firefox(executable_path="mypath/firefoxdriver_win64/geckodriver.exe")
browser.get('https://login.live.com')

WebDriverWait(browser, 10).until(EC.element_to_be_clickable(EMAILFIELD)).send_keys("mymail")
WebDriverWait(browser, 10).until(EC.element_to_be_clickable(NEXTBUTTON)).click()

WebDriverWait(browser, 10).until(EC.element_to_be_clickable(PASSWORDFIELD)).send_keys("mypassword")
WebDriverWait(browser, 10).until(EC.element_to_be_clickable(NEXTBUTTON)).click()

browser.get('https://onedrive.live.com/?v=photos')
browser.implicitly_wait(5)

#Click class="ItemTile-rowCheck" which the ancestor is class="List-cell"
elements = browser.find_elements_by_xpath('//div[@class="List-cell"]') #bring div elements which have class="List-cell"
print(elements)
for i in range(0,24) : #temporory
    print(i)

    row = elements[i].find_elements_by_css_selector('.ItemTile-rowCheck') #find .ItemTile-rowCheck among elements[i]
    print(row)
    print(row.click)

此代码运行结束时的结果是这样的。

[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="647f1105-2da6-47f0-870b-de097648cd21")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="442a5f3e-4301-4a80-b7f4-f5fba96a56e9")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="2654aa45-61ae-4360-995f-3d2b68eef4d8")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="ad471298-e830-4e51-8d3c-41addf085851")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="ca88ef30-6d7b-427f-9f9e-2240e803a15e")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="db1ae4c3-e80f-469d-89ee-5eea778b7913")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="0ac74651-1c1e-40b3-9ea2-2df41302ea06")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="12759c61-6c85-4d68-8dcb-ed75744ae2bb")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="a1bcd428-5f1d-44b5-bc7f-94d367c7e31f")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="e3b2e76d-d17e-4c00-a3fd-0b96f721037a")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="311d9527-4175-48eb-9447-d9dfdbc55bf8")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="6cd98ae1-6209-4fd1-a1e4-0faf744c59a1")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="f5d0a102-b9a9-4be5-9c71-58927c2d4e21")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="344d3cf5-3d68-4ef6-b0e1-f62ed4005b69")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="7369e37f-2b4b-4c73-ae1b-72a92ee590a5", element="f8777f86-d581-4697-96df-6c2b28490eed")>]
0
[]
Traceback (most recent call last):
  File "mypath\Desktop\firefox.py", line 36, in <module>
    print(row[0].click)
IndexError: list index out of range
[Finished in 71.3s with exit code 1]

【问题讨论】:

  • 虽然您使用 Sublime Text 运行代码,但这不是 Sublime Text 问题,因为 Sublime 所做的只是告诉 python 解释器运行您的代码。

标签: python selenium web-crawler


【解决方案1】:

如下图改变循环

elements = browser.find_elements_by_xpath("//div[@class='List-cell']//*[@class='ItemTile-rowCheck']")
print('Total rows ' + str(len(elements)))
for i in range(1,len(elements)) : # iterates through all elements
    print(i)
    row = browser.find_elements_by_xpath("//div[@class='List-cell']//*[@class='ItemTile-rowCheck']")[i]
    print(row)
    print(row.click)

【讨论】:

    【解决方案2】:

    @supputuri

    多亏了你,我知道了如何使用 xpath!太感谢了! 顺便说一句,我也是这样做的,它选择了一个涵盖整张照片的日期。 但是这种方式只选择偶数数组,[0],[2],[4].. 如果范围从 1 开始,选择奇数数组,[1],[3],[5]..

    #Before
    elements = browser.find_elements_by_xpath("//span[@class='od-AllPhotosHeader-check can-select']")
    print('Total rows ' + str(len(elements)))
    for i in range(0,len(elements)) :
        print(i)
        row = browser.find_elements_by_xpath("//span[@class='od-AllPhotosHeader-check can-select']")[i]
        row.click()
    

    所以我改变了这样的代码, 这行得通! 我想知道第一个代码无法选择整数是什么?

    #After
    elements = browser.find_elements_by_xpath("//span[@class='od-AllPhotosHeader-check can-select']")
    print(elements)
    for i in range(0,len(elements)) :
        print(i)
        row = elements[i]
        row.click()
    

    很抱歉这样回复,但评论太有限,无法添加代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2021-02-04
      • 2013-08-10
      • 2012-09-24
      相关资源
      最近更新 更多