Веб-скрейпинг: нужна помощь в последнем посте и найти ссылку

#python #selenium #selenium-webdriver #xpath #css-selectors

Вопрос:

Во-первых, извините за мой плохой английский.
На самом деле, у меня есть скрипт, который очищает веб-сайт, чтобы найти комментарии на веб-странице, на python.
Это для очистки всех сообщений на странице, но я хочу очистить только последний пост. Как это сделать, пожалуйста?
Кроме того, я захочу найти веб-ссылки, вероятно, опубликованные в последнем сообщении, но полную ссылку.
Это возможно?
Вот ссылка на веб — страницу и скрипт:

https://www.dealabs.com/discussions/suivi-erreurs-de-prix-1063390?page=9999

 #!/usr/bin/env python3
# https://www.jeuxvideo.com/forums/42-47-66784467-1-0-1-0-aide-scraping-python-forum-dealabs.htm
# scraping_dealabs.py

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By 

url = "https://www.dealabs.com/discussions/suivi-erreurs-de-prix-1063390?page=9999"

options = Options()
options.headless = True

driver = webdriver.Chrome(options=options)
driver.get(url)

# Accepter les cookies
button = WebDriverWait(driver, 2).until(
    EC.element_to_be_clickable((By.XPATH, "/html/body/main/div[4]/div[1]/div/div[1]/div[2]/button[2]/span"))
)
button.click()

# On recherche les commentaires et on affiche le texte
comments = driver.find_elements_by_class_name("commentList-item")

for comment in comments:
    _id = comment.get_attribute("id")
    author = comment.find_element_by_class_name('userInfo-username').text
    content = comment.find_element_by_class_name('userHtml-content').text
    timestamp = comment.find_element_by_class_name('text--color-greyShade').text
    comment_url = f"{url}#{_id}"

    print("Posté par", author)
    print(content)
    print("Publication:", timestamp)
    print("Lien du commentaire:")
    print(comment_url)
    print('-' * 30)

driver.close()
 

Спасибо за время и ответ!

Ответ №1:

Сначала я хотел бы, чтобы вы использовали правильные локаторы, поэтому вместо /html/body/main/div[4]/div[1]/div/div[1]/div[2]/button[2]/span того, чтобы пытаться использовать этот CSS-селектор .btn--mode-primary.overflow--wrap-on .
Для получения последнего комментария вы можете использовать этот XPath: (//div[@class='commentList-item'])[last()] Поэтому для получения сведений о последнем комментарии можно изменить только ваш код, чтобы он был таким:

 #!/usr/bin/env python3
# https://www.jeuxvideo.com/forums/42-47-66784467-1-0-1-0-aide-scraping-python-forum-dealabs.htm
# scraping_dealabs.py

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.action_chains import ActionChains

url = "https://www.dealabs.com/discussions/suivi-erreurs-de-prix-1063390?page=9999"

options = Options()
options.headless = True

driver = webdriver.Chrome(options=options)
driver.get(url)

actions = ActionChains(driver)

# Accepter les cookies
WebDriverWait(driver, 2).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn--mode-primary.overflow--wrap-on"))).click()

last_comment = driver.find_element_by_xpath("(//div[@class='commentList-item'])[last()]")

actions.move_to_element(last_comment).perform()
time.sleep(0.5)
last_comment = driver.find_element_by_xpath("(//div[@class='commentList-item'])[last()]")

_id = last_comment.get_attribute("id")
author = last_comment.find_element_by_xpath(".//span[contains(@class,'userInfo-username')]").text
content = last_comment.find_element_by_xpath(".//*[contains(@class,'userHtml-content')]").text
timestamp = last_comment.find_element_by_xpath(".//*[contains(@class,'text--color-greyShade')]").text
comment_url = f"{url}#{_id}"

print("Posté par", author)
print(content)
print("Publication:", timestamp)
print("Lien du commentaire:")
print(comment_url)
print('-' * 30)

driver.close()
 

UPD
Чтобы получить последний элемент на странице, как вы описали в комментариях, вам необходимо изменить локатор с

 last_comment = driver.find_element_by_xpath("(//div[@class='commentList-item'])[last()]")
 

Для

 last_comment = driver.find_element_by_xpath("(//div[@class='commentList-comment'])[last()]")
 

Так что весь приведенный выше код будет:

 #!/usr/bin/env python3
# https://www.jeuxvideo.com/forums/42-47-66784467-1-0-1-0-aide-scraping-python-forum-dealabs.htm
# scraping_dealabs.py

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.action_chains import ActionChains

url = "https://www.dealabs.com/discussions/suivi-erreurs-de-prix-1063390?page=9999"

options = Options()
options.headless = True

driver = webdriver.Chrome(options=options)
driver.get(url)

actions = ActionChains(driver)

# Accepter les cookies
WebDriverWait(driver, 2).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn--mode-primary.overflow--wrap-on"))).click()

last_comment = driver.find_element_by_xpath("(//div[@class='commentList-comment'])[last()]")

actions.move_to_element(last_comment).perform()
time.sleep(0.5)
last_comment = driver.find_element_by_xpath("(//div[@class='commentList-comment'])[last()]")

_id = last_comment.get_attribute("id")
author = last_comment.find_element_by_xpath(".//span[contains(@class,'userInfo-username')]").text
content = last_comment.find_element_by_xpath(".//*[contains(@class,'userHtml-content')]").text
timestamp = last_comment.find_element_by_xpath(".//*[contains(@class,'text--color-greyShade')]").text
comment_url = f"{url}#{_id}"

print("Posté par", author)
print(content)
print("Publication:", timestamp)
print("Lien du commentaire:")
print(comment_url)
print('-' * 30)

driver.close()
 

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

1. Спасибо за ответ @Prophet, но когда я запускаю ваш скрипт , я получаю ошибку:«, строка 36 author = last_comment.find_element_by_xpath(‘.//span[содержит(@класс,’userInfo-имя пользователя’)]’).text ^ SyntaxError: недопустимый синтаксис « Вы знаете, почему у меня это ошибка, пожалуйста?

2. ибп, мне очень жаль. Я это исправил. Я надеюсь, что теперь это будет работать правильно

3. Тнх. Сейчас это работает, но сценарий вышел только в первом посте, а не в последнем. Это странно

4. Попробуйте дать некоторую отсрочку, например time.sleep(3) , после EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn--mode-primary.overflow--wrap-on"))).click() . Чтобы комментарии загружались. Дай мне знать, если это поможет.

5. ОК. я проверил это, но всегда выходит первый комментарий.