selenium , how to get elements of a whatsapp message in order as they are?

Viewed 473

if this is the message " you " then i want output as

 
 you 

this is the html of that messasge

<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>

i tried this

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)

but this is giving output as

 you 


output should be

 
 you 

i tired for loop for emojis but its printing twice each emoji if there are two emojis in a message and trice each emoji if there are three emojis in a message can someone help me ?

1 Answers

Solution with 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))

Prints:


 you 

Related