【问题标题】:How to extract data using BeautifulSoup with multiple conditions with multiple tags如何使用带有多个标签的多个条件的 BeautifulSoup 提取数据
【发布时间】:2020-11-27 14:27:59
【问题描述】:

#我想提取评分为 4 或 5 的评论 cmets 的描述和评分。尝试了多个选项,最新如下:有人可以帮忙

import requests
from bs4 import BeautifulSoup
from scrapy.http import HtmlResponse
response = HtmlResponse(url='https://www.bankbazaar.com/credit-card.html')

url ='https://www.bankbazaar.com/credit-card.html'

r = requests.get(url) 
   
soup = BeautifulSoup(r.content, 'html5lib') 
  
quotes=[]  # a list to store quotes 
   
table = soup.find('div', attrs = {'class':'reviewbox-container'})

for row in table.findAll('li', attrs = {'class':'review-box'}): 
    quote = {} 
    quote['rating'] = row.find('input', name_ = 'review.reviewRating.customer.0') 
    quote['descr'] = row.find('div',class_ = 'text_here review-desc-more') 
    print(quotes.append(quote))

【问题讨论】:

  • 更新了描述,这会正确检索描述但无法检索评级然后提取所选数据:-----quote['descr'] = row.find('div', attrs={"class":"text_here review-desc-more"}).string

标签: python web-scraping beautifulsoup


【解决方案1】:

首先,当您看起来确实想要描述中的文本时,您正在抓取标签元素。其次,每个元素的name 属性都会发生变化,因此您要么需要使用正则表达式来搜索包含review.reviewRating.customer. 或以review.reviewRating.customer. 开头的名称元素,要么只需获取<input> 标签,不需要使用name 属性。最后,你不想print(quotes.append(quote)),因为它会返回None。我认为您要打印的是实际的quote

import requests
from bs4 import BeautifulSoup
import re
from scrapy.http import HtmlResponse
response = HtmlResponse(url='https://www.bankbazaar.com/credit-card.html')

url ='https://www.bankbazaar.com/credit-card.html'

r = requests.get(url) 
   
soup = BeautifulSoup(r.content, 'html5lib') 
  
quotes=[]  # a list to store quotes 
   
table = soup.find('div', attrs = {'class':'reviewbox-container'})

for row in table.findAll('li', attrs = {'class':'review-box'}): 
    quote = {} 
    if float(row.find('input')['value']) != 5.0:
        continue 
    quote['rating'] = row.find('input')['value']
    quote['descr'] = row.find('div',class_ = 'text_here review-desc-more').text.strip() 
    quotes.append(quote)
    print (quote)

【讨论】:

  • 非常感谢!你的回答和解释帮我解开了很多疑惑
  • @user2332713,你快到了。只是一些小事。
  • 如果我进一步想从字典中提取仅获得评级为 5.0 时对应的描述,我在下面尝试但是它提供了所有描述值并且没有按预期过滤。你能帮我解决我的遗漏吗:如果有的话(d['rating'] == '5.0' for d in quotes):res = [d['descr'] for d in quotes] print(res)
  • 只需将其全部转储到数据框中即可查询。否则,我明天可以更新解决方案。
  • 非常感谢!这有很大帮助?
【解决方案2】:

可能真正帮助人们解决此问题和类似问题的方法是将函数传递给 find() 或 find_all()。传递一个函数,该函数接受一个元素,即要检查的元素,如果满足您的条件,则返回 True。准确地找到您想要的东西真的很容易。

此处的文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多