【问题标题】:multiple lines in a cell in web scraping网页抓取中一个单元格中的多行
【发布时间】:2017-09-08 09:29:30
【问题描述】:

我正在尝试下载一个表格,该表格在一个单元格中包含多个项目。 我遇到了三个问题:

  1. tracklist 列未正确生成(它位于与其他数据类型相同的行中的下一行中(如标题中所写)];
  2. 最后一列(曲目列表)中的歌曲未嵌入到一个单元格中,我找不到摆脱多行格式的方法;
  3. 由于错误,下载在 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 函数的输出中看到:

  1. 通过将数据附加到每个列标题正确生成第一行;
  2. 从第二行开始,它一直工作到 tracklist 列,然后它会抛出以下行的所有文本,并通过执行相同的错误迭代从下一行重新开始。

了解问题的最佳方法是运行代码并查看输出(向下滚动应该可以清楚地了解迭代问题)。

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup urllib


    【解决方案1】:
    ...    
    for container in containerr:
        items = container("td")
        NN = items[0].text.encode('utf-8','ignore')
        album = items[1].text.encode('utf-8','ignore')
        interprete = items[2].text.encode('utf-8','ignore')
        etichetta = items[3].text.encode('utf-8','ignore')
        mass = items[4].text.encode('utf-8','ignore')
        tracklist = items[5].text.encode('utf-8','ignore')
    
        print("NN: " + NN)
        print("album: " + album)
        print("interprete: " + interprete)
        print("etichetta: " + etichetta)
        print("mass: " + mass)
        print("tracklist: " + tracklist)
    ...
    

    您可以将encode 的输出转换为utf-8ascii

    【讨论】:

    • 它不起作用,因为它似乎需要一些东西来告诉 csv 获取 utf-8。我尝试了 f = open(filename, "w", 'utf-8'),正如另一篇文章中所建议的那样,但它不起作用。
    • 如果您使用的是python2.+,则将编码样式设置为ascii
    • 我正在使用 python 3
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2022-01-21
    • 2018-12-27
    • 2021-01-26
    相关资源
    最近更新 更多