【问题标题】:How to extract a span tag inside div another tag如何在div另一个标签中提取span标签
【发布时间】:2018-01-17 14:33:59
【问题描述】:

我使用 Beautiful Soup 在 python 中编写了一个代码,用于从 IMDB 中提取用户名和他们的评分。但是有很多用户没有为他们的评论评分。很难用他们的评论准确地映射评级。那么我该怎么做这部分呢? http://www.imdb.com/title/tt2866360/reviews?ref_=tt_ov_rt 在此网址中,评论未指定评级。

url1 ="http://www.imdb.com/title/tt2866360/reviews?ref_=tt_ov_rt"

response = requests.get(url1, headers=headers)

page=response.content

soup=BeautifulSoup(page)

for k in soup.findAll('div',{"class":"load-more-data"}):

    if k.name == 'span' and m['class'] == "rating-other-user-rating":
        print blah()
    else:
        print blah 1()

这是检查评价部分是否存在于评论部分但它没有返回任何东西的代码?

【问题讨论】:

  • 在这个问题的上下文中print blah 1() 是什么?这是无效的语法。
  • 如果条件为真则打印评分,否则打印无或 0。

标签: python html beautifulsoup


【解决方案1】:

您要查找的信息(用户名、评级)位于“div.review-container”标签中。
关于没有评分的标签,你可以忽略它们。

for k in soup.find_all('div',{"class":"review-container"}):
    rating = k.find('span', class_='rating-other-user-rating')
    if rating:
        rating = ''.join(i.text for i in rating.find_all('span')[-2:])
    name = k.find('span', class_='display-name-link').text
    print name, rating

按下“加载更多”按钮时显示的信息是通过 XHR 请求加载的。
您将在“div.load-more-data”标签中找到执行请求所需的所有数据。

load_more = soup.find('div', class_='load-more-data')
url = 'http://www.imdb.com{}?paginationKey={}'.format(
    load_more['data-ajaxurl'], load_more['data-key']
    )
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')

只需重复上述过程,直到您获得所有信息。


import requests
from bs4 import BeautifulSoup

url = "http://www.imdb.com/title/tt2866360/reviews?ref_=tt_ov_rt"
ajax_url = url.split('?')[0] + "/_ajax?paginationKey={}"
reviews = []

while True:
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')

    for k in soup.find_all('div',{"class":"review-container"}):
        rating = k.find('span', class_='rating-other-user-rating')
        if rating:
            rating = ''.join(i.text for i in rating.find_all('span')[-2:])
        name = k.find('span', class_='display-name-link').text
        reviews.append([name, rating])
        print name, rating

    load_more = soup.find('div', class_='load-more-data')
    if not load_more:
        break
    url = ajax_url.format(load_more['data-key'])

【讨论】:

  • 您的解决方案永远是伟大的@sir t.m.adam。为此 +1。
  • 谢谢@Shahin,我真的很感激!
  • 您的解决方案非常好......但循环不会自动终止,我们需要关闭它。
  • 我们不能根据总评论设置循环条件
  • 很抱歉,它完全没问题……知道了……非常感谢。
【解决方案2】:

我建议您尝试在每条评论中控制来自<div class="review-container" ... 的内容。然后选择您要检索的特定数据。

【讨论】:

  • 我可以提供给你这个link。这是用 Python 记录数据的好指南。
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多