#python #selenium #web-scraping
Вопрос:
Я хочу удалить все элементы из приложения, но у меня возникли проблемы с selenium python, это мой код :
from selenium import webdriver
from selenium.webdriver.common import keys
import time
driver = webdriver.Chrome("path/to/chromedriver")
driver.get("https://web.whatsapp.com/")
time.sleep(10)
input("Qr Code: ")
driver.implicitly_wait(10)
numbers = driver.find_elements_by_class_name('_ccCW')
for n in numbers:
print(n.text)
и мой сценарий очищает только 17 предметов, а у whatsapp есть 3 класса _ccCW
FqYAR
i0jNr
, и в одном из каждого класса было 17 предметов, так как очистить эти три класса
Ответ №1:
к одному и тому же элементу WhatsApp можно получить доступ с помощью 2/3 разных xpath, поэтому использование одного xpath для элемента не всегда вернет текст.
некоторые расширения chrome помогут хорошо идентифицировать xpath. я использовал следующее расширение 4.
- Навигация по HTML DOM
- Истинный путь
- Помощник XPath
- Поиск XPath
ниже приведены основные элементы whatsapp
chat_search_box = "/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/div/label/div/div[2]"
selected_profile_header_name = "//HEADER[@class='_23P3O']//SPAN[@class='_ccCW FqYAR i0jNr']"
chat_name = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/header/div[2]/div[1]/div/span"
footer = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/footer/div[1]"
footer_textbox = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/footer/div[1]/div[2]/div/div[1]/div/div[2]"
msg_nav_arrow = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/div[3]/div/div[1]/span/div/span[2]"
ниже xpath указаны для доступа к имени чата в левой панели. они фиксированы, но номер div является динамическим. i = div # чат/группа
pane_base = "(//div[@id='pane-side']//div[@class='_3OvU8'])"
pane_search_parent = lambda x : pane_base "[" str(x) "]"
pane_group_last_sender = lambda i: pane_search_parent(i) "//span[@class='FqYAR i0jNr']"
pane_user_sms = lambda i : pane_search_parent(i) "//span[@class='_ccCW FqYAR i0jNr']"
pane_sms_date = lambda i: pane_search_parent(i) "//div[@class='_3vPI2']/div[@class='_1i_wG']"
pane_notif = lambda i: pane_search_parent(i) "//span[@class='_23LrM']"
pane_username = lambda i: pane_search_parent(i) "//div[@class='zoWT4']"
для доступа к сообщению из чата сложнее всего, и одни и те же элементы имеют несколько xpath.
msg_base = "(//div[@id='main']//div[@class='y8WcF']/div)[2]" #u have to change [2] with [n] to read specific msg
#u could find SENDER from any of 3 xpath depending on msg type.. sometime msg could be quoted text or first post or forwared msg or could be with image.
SENDER = [msg_base "/div/div/div/div[1]/span[1]", msg_base "//span[@class='a71At _3xSVM i0jNr']", msg_base "//span[@class='_1BUvv']"]
#following item follows same as SENDER. please add 'msg_base' to each list items.
SENDER_NAME = ['/div/div/div/div[1]/span[2]']
SENDER_TEXT = ['/descendant::div/span/span[1]','//span[@class="i0jNr selectable-text copyable-text"]']
QUOTED_TEXT = ['/div/div/div/div[2]/div[1]/div/div/div/div/div[2]',"//span[@class='quoted-mention i0jNr']",'/div/div/div/div[1]/div[1]/div/div/div/div/div[2]']
QUOTED_SENDER = ['/div/div/div/div[2]/div[1]/div/div/div/div/div[1]/span[1]','/div/div/div/div[1]/div[1]/div/div/div/div/div[1]/span',"//span[@class='a71At i0jNr']"]
TIME = ["//span[@class='kOrB_']",'/descendant::div[last()]']
Пожалуйста, не стесняйтесь задавать любые вопросы о очистке WhatsApp с помощью python selenium
Ответ №2:
Если имена классов _ccCW
, FqYAR
, а i0jNr
затем попробуйте
classes_to_get = ["_ccCW", "FqYAR", "i0jNr"]
for kls in classes_to_get:
numbers = driver.find_elements_by_class_name(kls)
for n in numbers:
print(n.text)
Ответ №3:
Попробуйте использовать этот xpath:
//div[@role='gridcell']//span[@title]
numbers = driver.find_elements_by_xpath("//div[@role='gridcell']//span[@title]")
for n in numbers:
print(n.text)
#print(n.get_attribute("innerText")) # You can also use this line to print the text.
Ответ №4:
Вы можете построить xpath со всеми 3 из них, как показано ниже :
//*[contains(@class, '_ccCW') or contains(@class, 'FqYAR') or contains(@class, 'i0jNr')]
Код :
numbers = driver.find_elements_by_xpath("//*[contains(@class, '_ccCW') or contains(@class, 'FqYAR') or contains(@class, 'i0jNr')]")
for n in numbers:
print(n.text)