Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于从多个页面中web刮取表的函数_Python_Function_Web Scraping Language - Fatal编程技术网

Python 用于从多个页面中web刮取表的函数

Python 用于从多个页面中web刮取表的函数,python,function,web-scraping-language,Python,Function,Web Scraping Language,我正在学习Python,我正在尝试创建一个函数,从几个不同的网页上获取疫苗接种率的表格,这是一个github存储库,用于我们世界的数据和数据。当web抓取单个表并将其保存到数据帧中时,该代码可以完美地工作 import requests from bs4 import BeautifulSoup import pandas as pd url = "https://github.com/owid/covid-19-data/blob/master/public/data/vac

我正在学习Python,我正在尝试创建一个函数,从几个不同的网页上获取疫苗接种率的表格,这是一个github存储库,用于我们世界的数据和数据。当web抓取单个表并将其保存到数据帧中时,该代码可以完美地工作

import requests  
from bs4 import BeautifulSoup 
import pandas as pd

url = "https://github.com/owid/covid-19-data/blob/master/public/data/vaccinations/country_data/Bangladesh.csv"
response = requests.get(url) 
response

scraping_html_table_BD = BeautifulSoup(response.content, "lxml") 
scraping_html_table_BD = scraping_html_table_BD.find_all("table", "js-csv-data csv-data js-file-line-container")
df = pd.read_html(str(scraping_html_table_BD))
BD_df = df[0]
但是,当我尝试创建一个函数来刮取几个页面时,运气不太好。我一直在关注本网站“用一个脚本刮多个页面”一节中的教程,以及其他页面中的StackOverflow问题。我曾尝试先创建一个全局变量,但最终出现了类似“递归错误:调用Python对象时超出了最大递归深度”这样的错误。这是我管理过的最好的代码,因为它不会生成错误,但我没有将输出保存到全局变量。我真的很感谢你的帮助

import pandas as pd  
from bs4 import BeautifulSoup
import requests

link_list = ['/Bangladesh.csv',
             '/Nepal.csv',
              '/Mongolia.csv']

def get_info(page_url):
    page = requests.get('https://github.com/owid/covid-19-data/tree/master/public/data/vaccinations/country_data' + page_url)
    scape = BeautifulSoup(page.text, 'html.parser')    
    vaccination_rates = scape.find_all("table", "js-csv-data csv-data js-file-line-container")
    result = {}

    df = pd.read_html(str(vaccination_rates))
    vaccination_rates = df[0]
    df = pd.DataFrame(vaccination_rates)
    print(df)
    df.to_csv("testdata.csv", index=False)

     
for link in link_list:
    get_info(link)
编辑:我可以查看保存到csv文件时迭代的最终网页,但不能查看前面链接中的数据

new = pd.read_csv('testdata6.csv')
pd.set_option("display.max_rows", None, "display.max_columns", None)
new

这是因为在每次迭代中,您的“testdata.csv”都会被一个新的覆盖。 因此,您可以:
df.to_csv(page_url[1:],index=False)

我猜您每次都会覆盖“testdata.csv”,因此您可以看到最终页面。我会添加枚举函数,以便在每次刮取页面时为单独的csv添加标识符,例如:

for key, link in enumerate(link_list):
get_info(link, key)
...
df.to_csv(f"testdata{key}.csv", index=False)

或者,将此csv作为获取信息功能的一部分打开,其步骤可在中找到。

谢谢您的帮助!!我设法将行附加到csv文件(然后将其读入数据帧),使用从您发布的链接中提取的行:“df.to_csv('log.csv',mode='a',index=False,header=False)”。但我会在enumerate上工作,看看是否能让它工作,它会很方便使用。我也尝试过iterrows,但运气不好。谢谢你的帮助,我没能让这行正常工作,但我很高兴现在使用“df.to_csv('log.csv',mode='a',index=False,header=False)”,但这是以后的欢呼