#python #selenium #web-scraping #beautifulsoup
Вопрос:
Я пытаюсь соскрести отзывы с веб-страницы. На прикрепленном изображении показано, что отзывы находятся в <p>
теге под классом div с именем «дополнительные данные отзывов». Сначала я использовал BeautifulSoup, а затем Selenium для извлечения части «дополнительные данные обзора», но потерпел неудачу, хотя другие <p>
<div>
теги и извлекаются хорошо. Один из нескольких обучающих веб-сайтов, которые я посетил, намекнул, что динамическая страница не будет отображать все источники, нажав «Проверить». Но здесь содержимое обзора отображается после нажатия кнопки Проверить, что означает, что эта страница не является динамической. Есть ли там кто-нибудь, кто мог бы предложить. Заранее спасибо. Для BeautifulSoup мой код выглядит так:
import requests
url = 'https://www.mouthshut.com/hindi-movies/Tanhaji-reviews-925997893'
response = requests.get(url)
page_contents = response.text
from bs4 import BeautifulSoup
doc = BeautifulSoup(page_contents, 'html.parser')
Для драйвера Selenium и Chrome я написал:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless')
driver = webdriver.Chrome("/usr/lib/chromium-browser/chromedriver", options=options)
import time
driver.get("https://www.mouthshut.com/hindi-movies/Tanhaji-reviews-925997893")
more_review_data_class = driver.find_elements_by_class_name("more reviewdata")
page_contents = driver.page_source
Комментарии:
1. попробуйте еще раз назвать класс.reviewdata (обратите внимание на точку между ними)
Ответ №1:
В случае нескольких имен классов вы должны использовать css-селектор или XPath.
Поэтому вместо
more_review_data_class = driver.find_elements_by_class_name("more reviewdata")
Попробуйте это:
more_review_data = driver.find_elements_by_css_selector(".more.reviewdata p")
или это
more_review_data = driver.find_elements_by_xpath("//div[@class='more reviewdata']//p")
Также вам следует добавить некоторое ожидание загрузки страницы перед доступом к элементам. Так что это будет что-то вроде этого:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 20)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.more.reviewdata p")))
time.sleep(0.5)
more_review_data = driver.find_elements_by_css_selector(".more.reviewdata p")
или
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 20)
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='more reviewdata']//p")))
time.sleep(0.5)
more_review_data = driver.find_elements_by_xpath("//div[@class='more reviewdata']//p")
Чтобы просто распечатать тексты внутри элемента, вы можете выполнить итерацию по списку элементов и распечатать текст каждого элемента следующим образом:
for element in more_review_data:
print(element.text)
или
for element in more_review_data:
print(element.get_attribute("innerHTML"))
Комментарии:
1. Я попробовал ваш код, и он возвращает следующее:
<selenium.webdriver.remote.webelement.WebElement (session="4ed11678498c1cf0d68fa180b934fe85", element="1732f835-78ed-47da-aaa7-1090b939b702")>
. Что мне делать дальше?2. Что ты пытался сделать? Он дает вам сам веб-элемент, а не текст внутри него. Вы хотите извлечь текст или что-то еще?
3. Да, я хочу извлечь текст внутри него. Я просмотрел список функций find_element_, но не могу понять, как продолжить.
4. Я добавил код для печати текстов. Обратите внимание, я добавил
p
родителя внутри локатора, чтобы получить самp
элемент, а не родителяdiv
. Оба должны работать правильно, однако лучше делать все точно.5. Это показывает ошибку, дорогая
TypeError: 'WebElement' object is not iterable
, в строкеfor element in more_review_data:
Ответ №2:
Когда вы загружаете содержимое сайта для отзывов, оно загружается динамично, поэтому, если вы перейдете в Developer mode
Network tab
раздел «Кому» и найдете данные, связанные с отзывами, появится ссылка, в которой содержатся все отзывы, связанные с сайтом!.
Код:
import requests
res=requests.get("https://www.mouthshut.com/Review/rar_reviews.aspx?cname=Tanhajiamp;cid=925997893amp;movie=1")
soup=BeautifulSoup(res.text,"lxml")
здесь я использовал селектор классов css, который возвращает список данных
main_data=soup.select("div.more.reviewdata")
for i in main_data:
print(i.find("p").get_text())
Вот результат приведенного выше сценария:
The movie is on real fact there was war for Kondhana ghad Tanhaji Malusare had attack on mughul on 4th - Feb 1670 and the brave fighter Tanhaji's one hand was cutted by Udaybhan but they still fighting and The Maratha's win the war I love the film and the unity of sawarj also great described in the film
. ....
Изображение:
Комментарии:
1. Я попрошу редактора этого ответа восстановить изображение, которое было более уместным и полезным для нас, чтобы лучше понять идею.
2. Хорошо, позвольте мне добавить это, извините, что я одобрил это!
Ответ №3:
Ты пробовал это сделать ?
driver.find_elements_by_xpath("//div[@class='class name']")
в вашем случае
driver.find_elements_by_xpath("//div[@class='more reviewdata']")
Комментарии:
1. это не похоже на python
2. да , исправил это