如何使用BeautifulSoup获得电影的所有IMDB用户评论

时间:2019-05-22 16:29:38

标签: python selenium web-scraping beautifulsoup findall

我正在做一个学校项目,想获得IMDB超级英雄电影的所有用户评论。

首先,我尝试仅获得一部电影的所有用户评论。

用户评论页面,由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 :(得分:0)

您使用BeautifulSoup 4 ,对吗?

方法名称从3更改为4。(document

此外,find_all使用标记名称,并为css类提供一个可选的class_参数(请参见此SO answer

因此您的代码应使用新名称:

    # 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]

最后,在获取汤时提供解析器:(document

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

否则,您将遇到此用户警告:

  

SO56261323.py:36:UserWarning:未明确指定解析器,因此   我正在为此系统使用最佳的HTML解析器   (“ html.parser”)。通常这不是问题,但是如果运行此命令   另一个系统或不同虚拟环境中的代码,它可能   使用不同的解析器并表现不同。