You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫爬取IMDB影评丢失换行内容问题求助

问题描述

爬取IMDB影评文本时,无法获取完整内容,换行后的部分丢失。例如原影评:

今晚在丹佛看了提前场。
我不知道从何说起。那就从最薄弱的环节说起吧——演技。虽说依旧出色,但随便找个合格的演员来饰演任何一个主要角色,都能有出色的表现。

代码仅提取到:

今晚在丹佛看了提前场。

原代码如下:

reviews = driver.find_elements(By.CSS_SELECTOR, 'div.review-container')
first_review = reviews[0]
sel2 = Selector(text = first_review.get_attribute('innerHTML'))

rating_list = []
review_date_list = []
review_title_list = []
author_list = []
review_list = []

error_url_list = []
error_msg_list = []
reviews = driver.find_elements(By.CSS_SELECTOR, 'div.review-container')

for d in tqdm(reviews):
    try:
        sel2 = Selector(text = d.get_attribute('innerHTML'))
        try:
            rating = sel2.css('.rating-other-user-rating span::text').extract_first()
        except:
            rating = np.NaN
        try:
            review = sel2.css('.text.show-more__control::text').get()
        except:
            review = np.NaN
        try:
            review_date = sel2.css('.review-date::text').extract_first()
        except:
            review_date = np.NaN    
        try:
            author = sel2.css('.display-name-link a::text').extract_first()
        except:
            author = np.NaN    
        try:
            review_title = sel2.css('a.title::text').extract_first()
        except:
            review_title = np.NaN

        rating_list.append(rating)
        review_date_list.append(review_date)
        review_title_list.append(review_title)
        author_list.append(author)
        review_list.append(review)

    except Exception as e:
        error_url_list.append(url)
        error_msg_list.append(e)
review_df = pd.DataFrame({
    'review_date':review_date_list,
    'author':author_list,
    'rating':rating_list,
    'review_title':review_title_list,
    'review':review_list
    })
解决方案

问题出在sel2.css('.text.show-more__control::text').get()这一行——::text只会匹配元素下的第一个文本节点,而IMDB的影评换行内容是多个独立文本节点或通过<br>分隔的,所以只拿到了第一行。

有两种修复方式:

方法1:用CSS选择器获取所有文本节点后拼接

把获取影评的代码改成:

review = '\n'.join(sel2.css('.text.show-more__control::text').getall())

getall()会返回该元素下所有的文本节点列表,用\n拼接就能保留原换行结构。

方法2:用XPath处理完整文本

如果想直接获取元素内的全部文本(自动过滤空行和多余空格),可以改用XPath:

# 保留换行结构
review_texts = sel2.xpath('.//div[@class="text show-more__control"]/text()').getall()
review = '\n'.join([text.strip() for text in review_texts if text.strip()]) if review_texts else np.NaN

# 合并为单段文本(去除换行)
review = sel2.xpath('normalize-space(.//div[@class="text show-more__control"])').get() or np.NaN

修改后的简化版循环示例:

for d in tqdm(reviews):
    try:
        sel2 = Selector(text = d.get_attribute('innerHTML'))
        rating = sel2.css('.rating-other-user-rating span::text').extract_first() or np.NaN
        # 方法1修复影评获取
        review_texts = sel2.css('.text.show-more__control::text').getall()
        review = '\n'.join([text.strip() for text in review_texts if text.strip()]) if review_texts else np.NaN
        review_date = sel2.css('.review-date::text').extract_first() or np.NaN
        author = sel2.css('.display-name-link a::text').extract_first() or np.NaN
        review_title = sel2.css('a.title::text').extract_first() or np.NaN

        rating_list.append(rating)
        review_date_list.append(review_date)
        review_title_list.append(review_title)
        author_list.append(author)
        review_list.append(review)

    except Exception as e:
        error_url_list.append(url)
        error_msg_list.append(e)

另外,原代码的多层try-except可以简化为or np.NaN,既简洁又能处理元素不存在的情况。

内容的提问来源于stack exchange,提问作者krsnbcd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:25:16