Python列表编码和导出为CSV问题
我是第一次尝试Python抓取,所以我正在修补各地的代码 现在我遇到了两个我不知道如何解决的问题:Python列表编码和导出为CSV问题,python,pandas,python-2.7,csv,beautifulsoup,Python,Pandas,Python 2.7,Csv,Beautifulsoup,我是第一次尝试Python抓取,所以我正在修补各地的代码 现在我遇到了两个我不知道如何解决的问题: 我的tbl列表仅将输出到test.csv到第一个单元格,并且即使我在.writer()中指定了条件,也不进行分隔 CSV文件的输出有一些编码问题,尽管我在Python shell上输出时没有看到任何问题 我目前正在使用Python 2.7 import urllib2 from bs4 import BeautifulSoup import csv import pandas as pd sit
tbl
列表仅将输出到test.csv
到第一个单元格,并且即使我在.writer()
中指定了条件,也不进行分隔import urllib2
from bs4 import BeautifulSoup
import csv
import pandas as pd
site= "https://www.investing.com/currencies/usd-sgd-forward-rates"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site,headers=hdr)
page = urllib2.urlopen(req)
soup = BeautifulSoup(page)
px_table = str(soup.find('table', attrs={'id':'curr_table'}))
print type(px_table)
tbl = pd.read_html(px_table, encoding='utf-8')
with open('test.csv', 'w') as myFile:
wr = csv.writer(myFile, delimiter=' ')
wr.writerow(tbl)
输出:
未命名:0名称出价要求高-低出价。时间
0美元/新加坡元,前一天-0.85 0.15-0.29-1.19 0.75 9:40:00
南部美国田纳西州新元FWD-0.50-0.45-0.35-0.45-0.08 9:43:00
2南部USDSGD SN FWD-0.30-0.20-0.29-0.21 0.10 9:42:00
3南部美元/新加坡元西南离岸价-2.17-1.69-1.80-1.80-0.16 9:42:00
4南部美元新币2W FWD-5.32-1.72-3.58-3.44-1.22 9:43:00
5南部3美元新加坡元FWD-6.15-4.35-5.12-5.17-0.30 9:42:00
6南部1百万美元新元前-8.53-7.74-8.00-8.10-0.17 9:42:00
7南部200万美元新加坡元,前汛期-15.81-14.81-14.75-15.15-0.25 9:43:00
8南部300万美元新加坡元,离岸价-25.00-24.07-23.53-24.07-0.40 9:42:00
9南部400万美元,前汛期-35.72-27.72-32.16-32.37-1.18 9:43:00
10南部500万美元新加坡元FWD-46.53-35.47-40.00-40.96-2.41 9:42:00
11南部600万美元新加坡元,离岸价-50.83-48.67-48.75-50.00 0.94 9:42:00
2012年南部700万美元新元离岸价-65.77-53.06-59.68-58.69-3.27 9:43:00
13南部800万美元新加坡元前汛期-79.41-59.65-66.98-69.70-6.61 9:42:00
14南部900万美元新元,前汛期-84.51-73.85-74.05-79.19-1.84 9:42:00
15南部1000万美元新元,前汛期-102.16-75.06-85.01-87.28-9.66 9:43:00
16南部1100万美元新加坡元,前一天-109.81-84.92-96.50-96.31-7.91 9:43:00
2017年1月1日南部美元新币-107.88-103.13-104.47-107.00 2.63 9:43:00
18南部1500万美元新元,前汛期-140.08-106.19-132.00-121.00 6.92 9:40:00
19 NaN USD 2100万新元FWD-200.00-151.00-185.50-180.50 14.00 9:40:00
20 NaN USDS SGD 2Y FWD-196.50-121.50-162.40-197.50 50.50 9:40:00
21 NaN美元新加坡元3年前-355.00-306.00-347.00-330.00 20.00 9:43:00
22南部2007年4月4日前145.00 211.00 0.00 0.00 1.00 31美元
23 NaN美元5年前117.00 187.00 0.00 0.00-4.00 2007年31月
24南部2007年7月7日前63.00 189.00 0.00 0.00-1.00 31美元
25南部10年前10日美元新加坡元-30.00 127.00 0.00 0.00 10.00 2007年31月
您应该使用Pandas函数来编写表。您还可以为文件指定文件编码,例如utf-8
:
import urllib2
from bs4 import BeautifulSoup
import pandas as pd
site = "https://www.investing.com/currencies/usd-sgd-forward-rates"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site, headers=hdr)
page = urllib2.urlopen(req)
soup = BeautifulSoup(page, "lxml")
px_table = str(soup.find('table', attrs={'id':'curr_table'}))
df_table = pd.read_html(px_table, encoding='utf-8')[0]
del df_table['Unnamed: 0']
df_table.to_csv('test.csv', encoding='utf-8', index=False)
这将为您提供一个test.csv
开头,如下所示:
名称、出价、出价、出价、出价、价格、时间
美元兑新加坡元,下旬-1.35,0.65,0.29,1.19,0.25,12:10:00
美国标准普尔500指数期货日前,-0.54,-0.46,-0.35,-0.49,-0.12,11:11:00
美元新币前一交单日,-0.43,-0.14,-0.29,-0.25,-0.03,12:11:00
美元新币西南离岸价,-1.99,-1.51,-1.8,-1.8,0.02,12:10:00
USDSGD 2W FWD,-5.63,-1.53,-3.58,-3.44,-1.53,12:11:00
此代码还会删除不需要的未命名:0
列,并禁止将索引列写入CSV文件
或者,您也可以不需要使用BeautifulSoup,因为
read_html()
将返回它能够找到的所有表的数据帧列表:
import urllib2
import pandas as pd
site = "https://www.investing.com/currencies/usd-sgd-forward-rates"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site, headers=hdr)
page = urllib2.urlopen(req)
df_table = pd.read_html(page.read(), encoding='utf-8')[1]
df_table.drop(df_table.columns[[0]], axis=1, inplace=True)
df_table['Name'] = df_table['Name'].str.encode('ascii', errors='ignore')
df_table.to_csv('test.csv', encoding='ascii', index=False)
这种方法还强制将
名称
列转换为ASCII。有一个关于“为什么该代码不起作用?”式问题的特定指令。你对这一点的无知可能导致你的问题偏离主题。哈哈,我还在想这是怎么回事。正如我上面提到的,代码几乎是我在网上找到的东西的拼凑。希望经过足够的练习我能找到一个模式。我真的不明白为什么人们不喜欢这个,谢谢你!输出文件中仍然有's',但我只是简单地将其过滤掉,以此来绕过它。CSV文件是用utf-8编码编写的。如果在支持utf-8的编辑器中打开该文件,它将正确显示。另一种方法是对ASCII进行转换,例如df_表['Name']=df_表['Name'].str.encode('ASCII',errors='ignore')