【发布时间】:2017-09-08 09:29:30
【问题描述】:
我正在尝试下载一个表格,该表格在一个单元格中包含多个项目。 我遇到了三个问题:
- tracklist 列未正确生成(它位于与其他数据类型相同的行中的下一行中(如标题中所写)];
- 最后一列(曲目列表)中的歌曲未嵌入到一个单元格中,我找不到摆脱多行格式的方法;
-
由于错误,下载在 1990 年停止
"UnicodeEncodeError: 'charmap' 编解码器无法对位置 2886 中的字符 '\x91' 进行编码:字符映射到
" 我找到了一些答案,但我仍然不明白如何明确解决问题。我昨天也遇到了同样的问题,通过网上阅读,似乎是系统无法识别的奇怪字符。有没有办法绝对解决问题(我会导出csv供excel使用)。
这是代码(在我尝试了@Anurag 的建议之后):
import codecs
import urllib
import urllib.request
from bs4 import BeautifulSoup
from urllib.request import urlopen as uReq
import unicodecsv as csv
years = list(range(1965,2016))
for year in years:
my_urls = ('http://www.hitparadeitalia.it/hp_yenda/lpe' + str(year) + '.htm',)
my_url = my_urls[0]
for my_url in my_urls:
uClient = uReq(my_url)
html_input = uClient.read()
uClient.close()
page_soup = BeautifulSoup(html_input, "html.parser")
[s.extract() for s in page_soup('script')]
filename = "ALBUM" + str(year) + ".csv"
f = open(filename, "w")
headers = "NN, album, interprete, etichetta, mass, tracklist" + "/n"
f.write(headers)
containers = page_soup.findAll("table", {"class":"piccolo"})
containerr = containers[0].findAll("tr")
container = containerr[0]
for container in containerr:
items = container.findAll("td")
NN = items[0].text
album = items[1].text
interprete = items[2].text
etichetta = items[3].text
mass = items[4].text
tracklist = items[5].text.strip()
print("NN: " + NN)
print("album: " + album)
print("interprete: " + interprete)
print("etichetta: " + etichetta)
print("mass: " + mass)
print("tracklist: " + tracklist)
f.write(NN + "," + album + "," + interprete + "," + etichetta + "," + mass + "," + tracklist + "\n")
f.close()
我从 print 函数的输出中看到:
- 通过将数据附加到每个列标题正确生成第一行;
- 从第二行开始,它一直工作到 tracklist 列,然后它会抛出以下行的所有文本,并通过执行相同的错误迭代从下一行重新开始。
了解问题的最佳方法是运行代码并查看输出(向下滚动应该可以清楚地了解迭代问题)。
【问题讨论】:
标签: python-3.x web-scraping beautifulsoup urllib