Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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列表编码和导出为CSV问题_Python_Pandas_Python 2.7_Csv_Beautifulsoup - Fatal编程技术网

Python列表编码和导出为CSV问题

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

我是第一次尝试Python抓取,所以我正在修补各地的代码

现在我遇到了两个我不知道如何解决的问题:

  • 我的
    tbl
    列表仅将输出到
    test.csv
    到第一个单元格,并且即使我在
    .writer()
    中指定了条件,也不进行分隔

  • CSV文件的输出有一些编码问题,尽管我在Python shell上输出时没有看到任何问题

  • 我目前正在使用Python 2.7

    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')