【问题标题】:Creating a Data Frame from the URL of a website using python使用 python 从网站的 URL 创建数据框
【发布时间】:2021-02-15 04:10:01
【问题描述】:

我一直致力于从 python 抓取网页,我想从网站的 URL 创建一个数据框。该文件的数据格式为.ods。我尝试使用 beautifulsoup 将 .ods 文件下载到计算机,然后读取它以创建数据框。该文件本身包含一个必须删除的标题。我通过这种方法取得了成功,我的代码附在下面。

from pandas_ods_reader import read_ods
import bs4            
import requests
import pandas as pd

url = "https://www.gov.uk/government/statistics/transport-use-during-the-coronavirus-covid-19-pandemic"
html = requests.get(url)
soup = bs4.BeautifulSoup(html.text, "html.parser")
i=0
for link in soup.find_all('a', href=True):
    i+=1
    href = link['href']

    if any(href.endswith(x) for x in ['.ods']):
        #print(href)
        file_data = requests.get(href).content
        with open('data.ods', "wb") as file:
            file.write(file_data)

df = read_ods('data.ods', 1, headers=False)[6:-44]
df.index = range(0, 346)
df.columns = df.iloc[0]
df.drop(0)
df

现在我想弄清楚是否可以不下载.ods文件直接实现这一点。如果有一种方法可以直接从网页中可用的 .ods 文件创建数据框,那将符合我的目的。如果可以的话,请建议一个合适的代码

【问题讨论】:

  • 将开头部分缩短为 soup.select_one('.thumbnail')['href']

标签: python web-scraping beautifulsoup


【解决方案1】:

我不知道你为什么选择所有的锚标签? a,顺便说一句,我想你会在可能有一个或多个文件的多个页面上应用相同的逻辑。

所以正确的做法是追加设置不能有任何重复的url。

然后你可以在pandasread_excel中加载url

我不想通过跳过startend 中的行数来解析表格。例如,您可以创建一个要解析的函数。例如,如果该行在第一列包含日期,则该表。

import requests
from bs4 import BeautifulSoup
import pandas as pd


def main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    links = set(x['href'] for x in soup.select('a[href$=ods]'))
    for link in links:
        df = pd.read_excel(link)
        print(df)
        #df.to_csv('data.csv',index= False)


if __name__ == "__main__":
    main("https://www.gov.uk/government/statistics/transport-use-during-the-coronavirus-covid-19-pandemic")
import requests
from bs4 import BeautifulSoup
import pandas as pd


def main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    links = set(x['href'] for x in soup.select('a[href$=ods]'))
    for link in links:
        df = pd.read_excel(link)
        print(df)
        #df.to_csv('data.csv',index= False)


if __name__ == "__main__":
    main("https://www.gov.uk/government/statistics/transport-use-during-the-coronavirus-covid-19-pandemic")

【讨论】:

  • 非常感谢您提供了这个很好的例子。感谢您的解释以及与我们分享您的想法和知识。祝你有美好的一天!
  • 感谢您的回答。结果XLRDError: Openoffice.org ODS file; not supported'在线df = pd.read_excel(link)
  • 非常感谢亲爱的 αԋɱҽԃ αмєяιcαη - 这看起来棒极了。感谢您与我们分享您的想法。来自西班牙(安达卢西亚)的问候,我们仍然期待收到您的来信;)
【解决方案2】:

Panda 的 read_excel 允许您直接从 url 加载数据帧。安装pip install odfpy后也可以使用它来加载odf文件:

import bs4            
import requests
import pandas as pd

url = "https://www.gov.uk/government/statistics/transport-use-during-the-coronavirus-covid-19-pandemic"
html = requests.get(url)
soup = bs4.BeautifulSoup(html.text, "html.parser")
i=0
for link in soup.find_all('a', href=True):
    i+=1
    href = link['href']
    #print(href)
    if any(href.endswith(x) for x in ['.ods']):
        print(href)
        df = pd.read_excel(href, header=None)[6:-44]
        df.index = range(0, 346)
        df.columns = df.iloc[0]
        df.drop(0)
df

【讨论】:

  • 感谢您的回答。结果XLRDError: Openoffice.org ODS file; not supported在线df = pd.read_excel(href, header=None)[6:-44]
  • 我安装了 odfpy 库并尝试使用df = pd.read_excel(href, header=None, engine='odf')[6:-44]。但是这个提出了ValueError: Unknown engine: odf
  • 这可能与this问题有关。尝试降级xlrd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2015-12-25
  • 1970-01-01
  • 2023-03-19
  • 2015-01-15
  • 2020-07-14
相关资源
最近更新 更多