當我取出html檔案并將它們匯入excel時遇到問題。
這是我需要獲取資訊的網站:https ://www.kylc.com/stats/global/yearly_per_country/g_gdp/vnm.html
如您所見,在 GDP 表中,我有一行名為:年份,由 2 行分隔
這就是為什么在我匯出 excel 檔案后它給出了意想不到的結果
我想要的結果是excel的第一行只有:年份,GDP(美元)占世界%
對不起,我的解釋混亂,我真的不知道如何詳細解釋。
這是我的python代碼
import requests
from bs4 import BeautifulSoup
import lxml
import csv
def get_html(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
r = "fail"
return r
def getGDP(ulist,html):
soup = BeautifulSoup(html,"html.parser")
trs = soup.find_all('tr')
for tr in trs:
list = []
for th in tr:
ts = th.string
if ts == '\n':
continue
list.append(ts)
ulist.append(list)
def saveGDP(ulist):
file_name = '21095010 胡碧玉 GDP.csv'
with open(file_name,'w',errors='ignore',newline='') as f:
f_csv = csv.writer(f)
f_csv.writerows(ulist)
def main():
unifo=[]
url='https://www.kylc.com/stats/global/yearly_per_country/g_gdp/vnm.html'
html=get_html(url)
getGDP(unifo,html)
saveGDP(unifo)
if __name__=="__main__":
main()
太感謝了!
uj5u.com熱心網友回復:
在大多數情況下,使用pandas刮板和清理結果更容易 - 引擎蓋下beautifulsoup為您作業。
在本例read_html()中,洗掉不需要的標題級別并過濾掉包含廣告的行:
import pandas as pd
df = pd.read_html('https://www.kylc.com/stats/global/yearly_per_country/g_gdp/vnm.html')[0].droplevel(0, axis=1)
df[~df.iloc[:,0].str.contains('ads')].to_csv('21095010 胡碧玉 GDP.csv', index=False)
回答你的問題
您必須選擇更具體的元素,例如使用css selectors.
因此,首先thead從所有 witout colspan 獲取資訊,而不是從所有不包含廣告的資料中th收集資料:trtbody
def getGDP(html):
soup = BeautifulSoup(html,"html.parser")
data = []
data.append([th.text for th in soup.select('thead th:not([colspan])')])
for row in soup.select('tbody tr:not(:-soup-contains("ads"))'):
data.append(list(row.stripped_strings))
return data
例子
import requests
from bs4 import BeautifulSoup
import lxml
import csv
def get_html(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
r = "fail"
return r
def getGDP(html):
soup = BeautifulSoup(html,"html.parser")
data = []
data.append([th.text for th in soup.select('thead th:not([colspan])')])
for x in soup.select('tbody tr:not(:-soup-contains("ads"))'):
data.append(list(x.stripped_strings))
return data
def saveGDP(ulist):
file_name = '21095010 胡碧玉 GDP.csv'
print(ulist)
with open(file_name,'w',errors='ignore', encoding='utf-8') as f:
f_csv = csv.writer(f)
f_csv.writerows(ulist)
def main():
url='https://www.kylc.com/stats/global/yearly_per_country/g_gdp/vnm.html'
html=get_html(url)
saveGDP(getGDP(html))
if __name__=="__main__":
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487946.html
標籤:Python python-3.x CSV 美丽的汤 jupyter-笔记本
上一篇:使用Python從一個檔案夾中讀取excel檔案并輸出到另一個檔案夾中的csv檔案時收到PermissionError?
下一篇:Python不會關閉最后一個檔案
