如何将网络抓取的表格转换为 csv?

Posted

技术标签:

【中文标题】如何将网络抓取的表格转换为 csv?【英文标题】:How do I convert a web-scraped table into a csv? 【发布时间】:2020-05-04 21:12:27 【问题描述】:

一年前,我在我的一个课程中学习了一些 Python,但从那时起就不用太多了,所以这可能是一个简单的问题。

我正在尝试从 Box Office Mojo 网络抓取所有时间表中票房最高的电影,我想获取 2010 年代前 10 部电影的排名、标题和总票房。我一直在玩python,我可以将整个表放入python,但我不知道如何从那里操作它,更不用说写出一个csv文件了。任何指导/提示?

这是为我打印整个表格的内容(前几行是从旧的网络抓取作业中复制的,以帮助我开始):

    import bs4
    import requests
    from bs4 import BeautifulSoup as soup

    url = "https://www.boxofficemojo.com/chart/top_lifetime_gross/"
    headers = 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, 
     like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    page_html = requests.get(url, headers=headers)

    page_soup = soup(page_html.text, "html.parser")

    boxofficemojo_table = page_soup.find("div", "class": "a-section imdb-scroll-table-inner")
    complete_table = boxofficemojo_table.get_text()
    print(complete_table)`

【问题讨论】:

您尝试将表中的每一行写入 CSV 什么?或者也许看看 openpyxl 或其他 excel 作家。 我可以把整个表导入 python 导入 Python 作为什么? 您的代码返回一个长字符串。我可以使用.get_text(separator=' ') 对其进行一些清理,但我认为您会希望根据某些标准将其拆分为字典。看起来您可以识别:,然后在此之前检查字符以获取您的密钥以及: 之后的所有内容作为值,但这可能需要一些复杂的逻辑。 【参考方案1】:

您可以为此使用 pd.read_html。

import pandas as pd

Data = pd.read_html(r'https://www.boxofficemojo.com/chart/top_lifetime_gross/')
for data in Data:
    data.to_csv('Data.csv', ',')

2.使用Bs4

import pandas as pd
from bs4 import BeautifulSoup
import requests

URL = r'https://www.boxofficemojo.com/chart/top_lifetime_gross/'
print('\n>> Exctracting Data using Beautiful Soup for :'+ URL)

try:
    res = requests.get(URL)
except Exception as e:
    print(repr(e))

print('\n<> URL present status Code = ',(res.status_code))
soup = BeautifulSoup(res.text,"lxml")
table = soup.find('table')

list_of_rows = []
for row in table.findAll('tr'):
    list_of_cells = []
    for cell in row.findAll(["td"]):
        text = cell.text
        list_of_cells.append(text)
    list_of_rows.append(list_of_cells)

for item in list_of_rows:
    ' '.join(item)

Data = pd.DataFrame(list_of_rows)
Data.dropna(axis = 0, how = 'all',inplace = True)
print(Data.head(10))

Data.to_csv('Table.csv')

【讨论】:

这太好了,谢谢!我唯一的问题是如何在最后从 2010 年代只拉出前 10 名。它会是嵌套在“for cell in row.findAll(["td"]) 下的“if/then”语句吗? 您可以在 DataFrame 上使用带有 iloc 函数的 pandas 来做到这一点

以上是关于如何将网络抓取的表格转换为 csv?的主要内容,如果未能解决你的问题,请参考以下文章

将从HTML表格抓取的数据写入CSV文件

Python - Web 抓取 HTML 表格并打印到 CSV

抓取:将存储为图片的数据添加到 python 3.5 中的 CSV 文件

将给定 URL 中的 HTML 表格抓取到 CSV

网络抓取转化率和图表[关闭]

网页抓取 - Python;写入 CSV