Распечатать определенные элементы в списке с помощью Python Selenium

#python #selenium #selenium-chromedriver

#python #selenium #selenium-chromedriver

Вопрос:

Я пытаюсь создать веб-скребок для Linkedin, используя Python и Selenium. Я пытаюсь распечатать заголовок, но на выходе отображается только пустой список, и я не уверен, почему. Я попытался распечатать все элементы в списке и использовать items.text.replace() для замены общих выходных данных, однако на выходе по-прежнему были все элементы. Я также пробовал печатать родительские разделы, но на выходе по-прежнему получается пустой список.

Вот код, который я написал:

 #search
driver.find_element_by_xpath("//*[@id='ember16']/input").send_keys("Steve Jobs")
driver.find_element_by_xpath("//*[@id='ember16']/input").send_keys(Keys.RETURN)

driver.implicitly_wait(3)

#result count
resultCount = driver.find_element_by_xpath("//*[@id='ember64']/div/h3")
print("n"   str(resultCount.text))

#printing
results = driver.find_elements_by_xpath('//*[@id="ember64"]/div/ul')

for items in results:
    print(str(driver.find_elements_by_xpath('//*[@id="ember552"]/div/div[2]/p[1]')) "n")
  

Вот результат:

 About 43,000 results
[]

Process finished with exit code 0
  

Можно ли как-нибудь указать элемент для печати во время итерации по списку?

РЕДАКТИРОВАТЬ: Вот минимальный воспроизводимый пример этого кода:

 # search url
url = 'https://www.linkedin.com/search/results/people/?keywords=Steve Jobsamp;origin=GLOBAL_SEARCH_HEADER'
driver.get(url)

# print job title
results = driver.find_elements_by_xpath('//*[@id="ember64"]/div/ul')
for items in results:

    print(driver.find_elements_by_xpath('//*[@id="ember552"]/div/div[2]/p[1]')) 
  

Вот результат:

 []


Process finished with exit code 0
  

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

1. Какую ссылку URL вы используете?

2. @Mike67 Я использую linkedin.com/login Затем он автоматически выполняет вход с помощью .send_keys() и .click(). Ссылка, приведенная выше, — это то, что я ввел в driver.get(), и как только я выполню поиск, я попаду на linkedin.com/search/results/people /…

3. Что выводит driver.find_elements_by_xpath(‘//*[@id=»ember552″]/div/div[2]/p[1]’).text?

4. @arundeepchohan Он печатает пустой список, который будет выглядеть как «[]»

5. @Greg Проверьте последние изменения. Я не включил код входа в пример, потому что счел это ненужным.

Ответ №1:

Попробуйте этот xpath:

 results = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH,"//*[contains(@class,'search-results__list list-style-none')]/li")))
  

а для заголовка вы можете использовать приведенный ниже xpath вместе с gettext()

 //*[contains(@class,'subline-level-1 t-14')]
  

Содержит(), используемый в xpath для поиска webelement с частичным текстом.
и явное ожидание может использоваться со многими условиями, я использовал одно из них выше. Рекомендуется использовать wait перед поиском любого webelement.
Более подробная информация о selenium wait refhttps://selenium-python.readthedocs.io/waits.html
функции xpath-https://docs.oracle.com/cd/E35413_01/doc.722/e35419/dev_xpath_functions.htm#autoId12
Xpath показывает мне весь список:
введите описание изображения здесь

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

1. Спасибо за ваш ответ, однако он напечатал пустой список в том же выводе, что и раньше. Я новичок в selenium, и я хотел бы знать, что делает contains(). Я предполагаю, что он находит xpath, содержащий это имя класса, но я не слишком уверен.