селен , как привести элементы сообщения WhatsApp в порядок, как они есть?

#python #python-3.x #list #selenium #selenium-webdriver

Вопрос:

если это сообщение «🌿 ты 👹», то я хочу вывести его как

 🌿 
 you 
👹
 

это html — код этого сообщения

 <div tabindex="0" class="_2wUmf _21bY5 message-in focusable-list-item"
    data-id="false_918779534186@c.us_2202BFA91F450D398715D5470DD09FE3"><span></span>
    <div class="cvjcv _1Ilru">
        <div class="Nm1g1 _22AX6">
            <div class="_22Msk">
                <div class="copyable-text" data-pre-plain-text="[6:57 pm, 19/08/2021] Diksha: ">
                    <div class="_1Gy50">
                        <span dir="ltr" class="i0jNr selectable-text copyable-text">
                            <span>
                                <img crossorigin="anonymous"
                                    src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
                                    alt="🌿" draggable="false" class="b22 emoji wa i0jNr selectable-text copyable-text"
                                    data-plain-text="🌿" style="background-position: 0px -80px;">
                                " you "
                                <img crossorigin="anonymous"
                                    src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
                                    alt="👹" draggable="false" class="b60 emoji wa i0jNr selectable-text copyable-text"
                                    data-plain-text="👹" style="background-position: -60px -40px;">
                            </span>
                        </span>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
 

я попробовал это

 chats = driver.find_elements_by_class_name("message-in")
for i in range(0,len(chats)):
    messages = chats[i].find_elements_by_class_name("i0jNr")
    for msg in messages:
        if msg.text == "" :        
            emoji = chats[i].find_element_by_class_name("emoji")
            print(emoji.get_attribute('alt'))
        else:
            print(msg.text)
 

но это дает результат в виде

  you 
🌿
🌿
 

результат должен быть

 🌿 
 you 
👹
 

я устал от цикла для смайликов, но он печатает дважды каждый смайлик, если в сообщении два смайлика, и трижды каждый смайлик, если в сообщении три смайлика
, может ли кто-нибудь мне помочь ?

Комментарии:

1. Его можно использовать beautifulsoup ?

2. да, вы можете использовать beatifulsoup и дать мне решение на самом деле я не знаю beatifulsoup, но я знаю основы этого @Andrej Kesely

Ответ №1:

Решение с beautifulsoup :

 from bs4 import BeautifulSoup

html_doc = """
<div tabindex="0" class="_2wUmf _21bY5 message-in focusable-list-item"
    data-id="false_918779534186@c.us_2202BFA91F450D398715D5470DD09FE3"><span></span>
    <div class="cvjcv _1Ilru">
        <div class="Nm1g1 _22AX6">
            <div class="_22Msk">
                <div class="copyable-text" data-pre-plain-text="[6:57 pm, 19/08/2021] Diksha: ">
                    <div class="_1Gy50">
                        <span dir="ltr" class="i0jNr selectable-text copyable-text">
                            <span>
                                <img crossorigin="anonymous"
                                    src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
                                    alt="🌿" draggable="false" class="b22 emoji wa i0jNr selectable-text copyable-text"
                                    data-plain-text="🌿" style="background-position: 0px -80px;">
                                " you "
                                <img crossorigin="anonymous"
                                    src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
                                    alt="👹" draggable="false" class="b60 emoji wa i0jNr selectable-text copyable-text"
                                    data-plain-text="👹" style="background-position: -60px -40px;">
                            </span>
                        </span>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
"""

soup = BeautifulSoup(html_doc, "html.parser")

# search text:
text = soup.select_one(".copyable-text")

# convert all <img> to plain text:
for tag in text.select("[data-plain-text]"):
    tag.replace_with(tag["data-plain-text"])

# get all non-empty lines:
all_text = [t.strip().strip('"') for t in text.find_all(text=True) if t.strip()]
print("n".join(all_text))
 

С принтами:

 🌿
 you 
👹
 

Комментарии:

1. это работает , братан, Но можем ли мы использовать этот bs4 для динамических случаев, то есть мы напечатали это в нашем терминале, потому что у нас был html-код этого . как будто я хочу сказать, что хочу получать все сообщения из чата WhatsApp, подобного этому . Так как же я могу это сделать? @Андрей Кесели

2. @PranavPatil, если я вас правильно понял, вы можете подавать driver.page_source BeautifulSoup(driver.page_source, "html.parser") , а затем использовать bs4