Как я могу использовать BeautifulSoup, чтобы получить все IMDB отзывы пользователей о фильме - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над школьным проектом и хочу получить все отзывы пользователей о фильмах о супергероях IMDB.

Сначала я пытаюсь получить все отзывы пользователей только о 1 фильме.

Страница отзывов пользователей, состоит из 25 отзывов пользователей и кнопки «загрузить еще». Пока мне уже удалось написать код, чтобы открыть кнопку загрузки еще. Я застрял во второй части: получение всех пользовательских отзывов в списке.

Я уже пытался использовать BeautifulSoup, чтобы найти все «контентные» части на странице. Тем не менее, мой список остается пустым.

from bs4 import BeautifulSoup
testurl = "https://www.imdb.com/title/tt0357277/reviews?ref_=tt_urv"
patience_time1 = 60
XPATH_loadmore = "//*[@id='load-more-trigger']"
XPATH_grade = "//*[@class='review-container']/div[1]"
list_grades = []

driver = webdriver.Firefox()
driver.get(testurl)

# This is the part in which I open all 'load more' buttons.
while True:
    try:
        loadmore = driver.find_element_by_id("load-more-trigger")
        time.sleep(2)
        loadmore.click()
        time.sleep(5)
    except Exception as e:
        print(e)
        break
    print("Complete")
    time.sleep(10)

    # When the whole page is loaded, I want to get all 'content' parts.
    soup = BeautifulSoup(driver.page_source)
    content = soup.findAll("content")
    list_content = [c.text_content() for c in content]

driver.quit()

Я ожидаю получить список всего содержимого рецензионных контейнеров на сайте. Тем не менее, мой список остается пустым.

1 Ответ

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

Вы используете BeautifulSoup 4 , правильно?

Имена методов изменены с 3 на 4. ( документ )

Кроме того, find_all принимает имя тега и необязательный параметр class_ для класса css (см. Этот SO ответ )

Таким образом, ваш код должен использовать новое имя:

    # content = soup.findAll("content")
    content = soup.find_all('div', class_=['text','show-more__control'])

Также используйте get_text() в вашем понимании списка:

# list_content = [c.text_content() for c in content]
list_content = [tag.get_text() for tag in content]

Наконец, предоставьте парсер при получении супа: ( документ )

    soup = BeautifulSoup(driver.page_source, features="html.parser")

В противном случае вы столкнетесь с этим предупреждением пользователя:

SO56261323.py: 36: Предупреждение пользователя: синтаксический анализатор не был указан явно, поэтому Я использую лучший доступный HTML-парсер для этой системы ( "Html.parser"). Обычно это не проблема, но если вы запустите это код в другой системе или в другой виртуальной среде, это может используйте другой парсер и ведите себя по-другому.

...