文本编码和列排列在2.x中提供UnicodeEncodeError

时间:2019-02-19 00:14:50

标签: python pandas csv web-scraping beautifulsoup

已解决 这是2.x中的Unicode问题,升级到3.x时没有问题

我正在尝试学习使用Python和BeautifulSoup进行网络抓取,以将数据导出到可读的电子表格中。我有两个问题:

问题1:当遇到诸如商标符号(tm)之类的符号时,我在尝试不同的站点时多次遇到障碍,我该如何删除它或将其编码为可允许大熊猫将数据输出到csv中?

问题2:当我确实导出数据时(通过省略包含问题1中引用的字符的行),这些列不一定按我想要的顺序排列。如何指定列的排列顺序?

问题1尝试的解决方案:

  • 省略包含无法识别字符的行(有效但不是最佳)。
  • 调用变量并使用.encode('utf-8')无效

问题2尝试的解决方案:

  • 重新排列df中的变量。
  • 在列名之前添加一个数字值(仍然可以,但不是最佳选择)

import csv
import requests
from bs4 import BeautifulSoup
import pandas

stocksym = []
stockname = []
stockprice = []
data = requests.get('https://finance.yahoo.com/most-active?offset=0&count=100')

soup = BeautifulSoup(data.text, 'html.parser')

div =soup.find('div', { 'id': 'scr-res-table' })
table = div.find('table')
tbody = table.find('tbody')

for tr in tbody.find_all('tr'):

        sym = tr.find_all('td')[0].text.strip()

        stocksym.append((sym))

        name = tr.find_all('td')[1].text.strip()

        stockname.append((name))

        price = tr.find_all('td')[2].text.strip()

        stockprice.append((price))

df = pandas.DataFrame({

        "1Sym": stocksym,

        "2Name": stockname,

        "3Price": stockprice

        })

df.to_csv("output.csv", index=False)

print(df)

我希望排名前100的股票的输出将以符号,名称和价格的列顺序导出到csv。

实际结果是在遇到的第一个不受支持的字符处停止,并且要求我在列名之前加上数字以获取所需的顺序。

1 个答案:

答案 0 :(得分:0)

read_html中使用pandas函数会更容易,并且遇到的问题也更少。如果遇到错误,只需安装lxml库,pandas便会使用该库进行HTML处理。

import csv
import requests
from bs4 import BeautifulSoup
import pandas as pd

data = requests.get('https://finance.yahoo.com/most-active?offset=0&count=100')
soup = BeautifulSoup(data.text, 'html.parser')

div = soup.find('div', { 'id': 'scr-res-table' })
table = div.find('table')

df = pd.read_html(table.prettify())[0][["Symbol", "Name", "Price (Intraday)"]]
df.to_csv("output.csv", index=False, encoding="utf-16")