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
相关产品推荐
相关产品推荐

