Найти элемент elemtnt * s * return с тем же элементом - PullRequest
1 голос
/ 28 мая 2019

Я занимался этим уже 2 дня.

Пытался получить весь текст (ы) из диапазона (ов), которые появляются во многих div (ах).

Всеdiv выглядит примерно одинаково:

<div class="_3_7SH _3DFk6 message-in">
<div class="Tkt2p">
<div class="copyable-text" data-pre-plain-text="[10:26 AM, 5/28/2019] יוסף צדוק: ">
<div class="_3zb-j ZhF0n">
<span dir="rtl" class="XELVh selectable-text invisible-space copyable-text">TEXT TO COPY IS ME</span></div></div>
<div class="_2f-RV"><div class="_1DZAH">
<span class="_1ORuP">
</span><span class="_3EFt_">10:26 AM</span></div></div></div><span></span></div>

Вот как пытались найти ВСЕ элементы "сообщения":

in_mesg_arr = driver.find_elements_by_xpath("//div[contains(@class, 'message-in')]")

Iвернул длину массива: 11

Затем попытался получить весь текст из диапазона (ов):

for index in in_mesg_arr:
   last_msg = last_msg + str(index.find_element_by_xpath(
    "//span[contains(@class,'selectable-text invisible-space copyable-text')]").text)

ОДНАКО, я получаю один и тот же текст (тот же элемент)снова и снова!).

print (last_msg) = бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла *

Будем рады получить несколько указаний.

ПОЛНЫЙ HTML:

Ответы [ 3 ]

2 голосов
/ 28 мая 2019
for index in last_msg:
   last_msg = last_msg + str(in_mesg_arr[index].find_element_by_xpath(
    "//span[contains(@class,'selectable-text invisible-space copyable-text')]").text)

Этот код всегда будет возвращать 1-й элемент, поскольку он будет искать элемент span в любом месте DOM.

. Выражение XPath в цикле должно начинаться с dot для конкретного контекста. Используйте любой из следующего кода.

 in_mesg_arr = driver.find_elements_by_xpath("//div[contains(@class, 'message-in')]")
    for item in in_mesg_arr:
        spanele=item.find_element_by_xpath(".//span[contains(@class,'selectable-text invisible-space copyable-text')]")
        print(spanele.text)

ИЛИ

in_mesg_arr = driver.find_elements_by_xpath("//div[contains(@class, 'message-in')]")

for item in range(len(in_mesg_arr)):
    spanele=in_mesg_arr[item].find_element_by_xpath(".//span[contains(@class,'selectable-text invisible-space copyable-text')]")
    print(spanele.text)

Дайте мне знать, как это происходит.

0 голосов
/ 28 мая 2019

Может быть, когда вы получаете пролеты, вы используете

find_element_by_xpath 

вместо

find_elements_by_xpath

Так что каждый раз возвращается только первый соответствующий элемент.

см. Ответ на этот вопрос: https://sqa.stackexchange.com/questions/37380/find-elements-by-xpath-issue?answertab=votes#tab-top

0 голосов
/ 28 мая 2019

Это можно сделать с помощью BeautifulSoup

from bs4 import BeautifulSoup
content = '''
    <div> class = "*something* message-in *something*" <div>
    <span> class = "selectable-text invisible-space copyable-text" <span>
    '''
soup = BeautifulSoup(content,"lxml")

span_text =  [x.get_text() for x in  soup.find_all('span')]



html_con = '''
<div class="_3_7SH _3DFk6 message-in">
<div class="Tkt2p">
<div class="copyable-text" data-pre-plain-text="[10:26 AM, 5/28/2019] יוסף צדוק: ">
<div class="_3zb-j ZhF0n">
<span dir="rtl" class="XELVh selectable-text invisible-space copyable-text">TEXT TO COPY IS ME</span></div></div>
<div class="_2f-RV"><div class="_1DZAH">
<span class="_1ORuP">
</span><span class="_3EFt_">10:26 AM</span></div></div></div><span></span></div>
<div class="_3_7SH _3DFk6123456 message-in">
<div class="Tkt2p">
<div class="copyable-text" data-pre-plain-text="[10:26 AM, 5/28/2019] יוסף צדוק: ">
<div class="_3zb-j ZhF0n">
<span dir="rtl" class="XELVh selectable-text invisible-space copyable-text">New text</span></div></div>
<div class="_2f-RV"><div class="_1DZAH">
<span class="_1ORuP">
</span><span class="_3EFt_">10:26 AM</span></div></div></div><span></span></div>
'''

soup = BeautifulSoup(html_con)

content_message_in= soup.find_all('div', {'class': 'message-in'})
span_content =[x.find_all('span') for x in content_message_in]
span_text  = [x[0].get_text() for x in span_content]


#o/p
['TEXT TO COPY IS ME', 'New text']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...