簡體   English   中英

如何在 Python 和 Selenium 中找到具有相同 class 名稱的多個用戶名?

[英]How can I find multiple usernames that have the same class name in Python with Selenium?

    if type == 2:
        for p in range(1, maxpages + 1):
            link = url + str(p)
            driver.get(link)

            Users = driver.find_elements_by_class_name("link span h5 hv7 secondary")
            print(Users[0].text)
            print(Users[1].text)
            print(Users[2].text)

我希望你能理解我想用上面的代碼做什么。

我正在嘗試查找具有 class 名稱的所有元素:link span h5 hv7 secondary(超過 100 個)

然后分別打印出來。

Nic 的回復錯誤:

User: <selenium.webdriver.remote.webelement.WebElement (session="39c90e31145c4cc21937f591facb1d2d", element="880b3920-08ae-443b-a7ad-621ffd988ce8")>
Age: <selenium.webdriver.remote.webelement.WebElement (session="39c90e31145c4cc21937f591facb1d2d", element="dc0297b0-f21f-4492-8be4-e14b5126d2bb")>
Traceback (most recent call last):
  File "C:\Users\VENA2\PycharmProjects\pythonProject\main.py", line 85, in <module>
    print(f"Text: {user_container.find_element_by_css_selector('div.f6.nowrap.truncate')}")
  File "C:\Users\VENA2\PycharmProjects\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 430, in find_element_by_css_selector
    return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
  File "C:\Users\VENA2\PycharmProjects\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 658, in find_element
    return self._execute(Command.FIND_CHILD_ELEMENT,
  File "C:\Users\VENA2\PycharmProjects\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\VENA2\PycharmProjects\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\VENA2\PycharmProjects\pythonProject\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"div.f6.nowrap.truncate"}
  (Session info: chrome=87.0.4280.88)


Process finished with exit code 1

class 屬性中的空格表示多個類,因此請使用“。” 而不是空格來表示多個類:

   Users = driver.find_elements_by_class_name("link.span.h5.hv7.secondary")

您還可以使用 xpath 或 css 來匹配精確的 class 屬性值:

CSS:

     Users = driver.find_elements_by_css_selector("[class='link span h5 hv7 secondary']")

Xpath:

     Users = driver.find_elements_by_xpath("//*[@class='link span h5 hv7 secondary']")

使用帶空格的 class 示例:

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
#options.headless = True
options.add_argument("--window-size=1920,1080")
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument(
    "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36")
browser = webdriver.Chrome(options=options)
browser.get("https://www.instagram.com")
sleep(5)
#browser.refresh()
elem=browser.find_element_by_class_name('RP4i1.UVauz')
print(elem.get_attribute("outerHTML"))
browser.get_screenshot_as_file(f"screenshot.png")

Output:

<img class="RP4i1  UVauz" src="/static/images/homepage/screenshot1.jpg/d6bf0c928b5a.jpg" alt="">

只需遍歷它們。

for user in Users:
    print(user.text)

使用find_elements_by_class_name您必須將每個空格替換為“。” 正如@PDHide 所述。 此選擇僅限於類,我建議將css_selectorfind_elements_by_css_selector一起使用。 這允許您混合 ID、classNames、tagName..

您需要輸入的值與 css 查詢相同。 首先 class 必須以“.”開頭並且同一級別的任何類都必須用“。”分隔。 以及。 如果它們是多個級別(子級),則用空格隔開,后跟“.”。

更多關於帶有 selenium 的 css_selector 的信息在 這里
有關如何在此處建立查詢值的更多信息

完成查詢后,您可以使用 for 循環通過列表進行交互:

Users = driver.find_elements_by_css_selector("yourCssSelectorValue")
for user in Users:
    print(user.text)

從提供的屏幕截圖中,這里有一個獲取用戶/年齡/文本的解決方案。

首先獲取父元素:

user_containers = driver.find_elements_by_css_selector('div.relative.flex-auto.mw-100')

然后獲取每個 Childs 並打印結果:

for user_container in user_containers:
    print(f"User: {user_container.find_element_by_css_selector('.link.span.h5.hv7.secondary').text}")
    print(f"Age: {user_container.find_element_by_css_selector('span.f6.fw7.silver').text}")
    print(f"Text: {user_container.find_element_by_css_selector('div.f6.nowrap.truncate').text}")

這是一種方式,但會有很多閱讀。

另一種解決方案,您也可以通過這種方式獲取所有孩子:

users = driver.find_element_by_css_selector('.link.span.h5.hv7.secondary')
age = driver.find_element_by_css_selector('span.f6.fw7.silver')
text = driver.find_element_by_css_selector('div.f6.nowrap.truncate')

然后 zip 列表並打印每個結果:

for values in zip(users, age, text):
    print(f"Users: {values[0].text}")
    print(f"Age: {values[1].text}")
    print(f"Text: {values[2].text}")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM