如何使用 BeautifulSoup 从多个 URL 检索数据(Python 仅返回最后一行)

问题描述 投票:0回答:1

我正在构建一个代码,该代码将从航空公司评论网站检索所有评论标题。我使用 5 个不同的 URL,因为我想比较 5 家不同航空公司的名称。但是,我的代码仅列出最后列出的 URL(针对阿拉斯加航空公司)的评论标题。我最初创建了一个包含所有 URL 的列表,但它具有完全相同的错误,仅显示阿拉斯加航空的结果。

我的代码:

# Insert the following command into the command prompt before starting for faster run time:

# jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10

#Importing and installing necessary packages
!pip install lxml
from bs4 import BeautifulSoup
import requests
import pandas as pd
from pprint import pprint;

base_url = 'https://www.airlinequality.com/airline-reviews/'

ending = ['american-airlines', 'delta-air-lines', 'united-airlines',
           'southwest-airlines', 'alaska-airlines']

for ending in endings:
    url = base_url + ending
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    results = soup.find('div', id='container')

# Retrieving all reviews
titles = results.find_all('h2', class_='text_header')

for title in titles:
    print(title, end="\n"*2)

我的输出:

“一流的客户服务” “非常不满意” “一切都太棒了” “乱七八糟的航空公司” “代理人显然非常关心” “沟通非常缺乏” “从未遇到过更粗鲁的门卫” “我们的托运行李严重损坏” “永远不要再预订阿拉斯加航空” “我没能上飞机” 全球最佳航空公司 最好的机场工作人员 最清洁的航空公司 阿拉斯加航空照片

我预计会得到此输出,但对于所有 5 个 URL。如何从所有 URL 检索评论标题?

python web-scraping url beautifulsoup jupyter
1个回答
0
投票

您将在每个循环中覆盖结果 - 将结果存储在列表中或直接抓取所需的信息。示例将它们存储在字典列表中,您可以简单地将它们转换为数据框:

import requests
import pandas as pd

base_url = 'https://www.airlinequality.com/airline-reviews/'

endings = ['american-airlines', 'delta-air-lines', 'united-airlines',
           'southwest-airlines', 'alaska-airlines']

data = []

for ending in endings:
    url = base_url + ending
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    for e in soup.select('article[itemprop="review"]'):
        data.append({
            'title': e.h2.text,
            'rating':e.select_one('span[itemprop="ratingValue"]').text
        })

pd.DataFrame(data)
© www.soinside.com 2019 - 2024. All rights reserved.