【问题标题】:Removing string unicode marks from list and having each item on separate line从列表中删除字符串 unicode 标记并将每个项目放在单独的行上
【发布时间】:2015-06-26 16:05:02
【问题描述】:

我有一个列表 listOfActors,其中包含来自本网站 - http://www.boxofficemojo.com/yearly/chart/?yr=2013&p=.htm 的数据中每部电影的演员子列表。

我使用网络爬取功能获取演员

def getActors(item_url):
    response = requests.get(item_url)
    soup = BeautifulSoup(response.content, "lxml")  # or BeautifulSoup(response.content, "html5lib")
    tempActors = []
    try:
        tempActors.append(soup.find(text="Actors:").find_parent("tr").find_all(text=True)[1:])
    except AttributeError:
        tempActors.append("n/a")
    return tempActors

结果是这种格式的演员列表

[u'Jennifer Lawrence', u'Josh Hutcherson', u'Liam Hemsworth', u'Elizabeth Banks', u'Stanley Tucci', u'Woody Harrelson', u'Philip Seymour Hoffman', u'Jeffrey Wright', u'Jena Malone', u'Amanda Plummer', u'Sam Claflin', u'Donald Sutherland', u'Lenny Kravitz']
[u'Robert Downey, Jr.', u'Gwyneth Paltrow', u'Don Cheadle', u'Guy Pearce', u'Rebecca Hall', u'James Badge Dale', u'Jon Favreau', u'Ben Kingsley', u'Paul Bettany*', u' ', u'(Voice)', u'Mark Ruffalo*', u' ', u'(Cameo)']

我将这些数据导出到一个 csv 文件中,这些列表中的每一个都位于单独的行中。我有两个问题:

首先,如何从每个子列表中删除“u”标记,最好还包括括号?

其次,当我打开 csv 文件时,我希望每个演员都在 Excel 中自己的块中。现在他们都在一个巨大的街区。

我希望最终的输出是这样的:

詹妮弗·劳伦斯|乔什·哈切森|利亚姆·海姆斯沃斯|...等等等等 第四次

小罗伯特·唐尼 |格温妮丝·帕特洛|唐·钱德尔|

而不是

[u'Jennifer Lawrence', u'Josh Hutcherson', u'Liam Hemsworth', u'Elizabeth Banks', u'Stanley Tucci', u'Woody Harrelson', u'Philip Seymour Hoffman', u'Jeffrey Wright', u'Jena Malone', u'Amanda Plummer', u'Sam Claflin', u'Donald Sutherland', u'Lenny Kravitz']

[u'Robert Downey, Jr.', u'Gwyneth Paltrow', u'Don Cheadle', u'Guy Pearce', u'Rebecca Hall', u'James Badge Dale', u'Jon Favreau', u'Ben Kingsley', u'Paul Bettany*', u' ', u'(Voice)', u'Mark Ruffalo*', u' ', u'(Cameo)']

这是我调用 getActors 函数的主要网络爬虫函数:

def spider(max_pages):
    page = 1
    while page <= max_pages:
        url = 'http://www.boxofficemojo.com/yearly/chart/?page=' + str(page) + '&view=releasedate&view2=domestic&yr=2013&p=.htm'
        source_code = requests.get(url)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text)
        for link in soup.select('td > b > font > a[href^=/movies/?]'):
             href = 'http://www.boxofficemojo.com' + link.get('href')
            listOfActors.append(getActors(href))
        page += 1

【问题讨论】:

  • 请显示您拥有的完整代码,包括您导出到 csv 的部分。
  • 我看到你的刮刀开始工作了 ;)
  • s = map(lambda x: x.encode('ascii'),s) 会将其转换为 ascii(删除 u)

标签: python csv unicode beautifulsoup web-crawler


【解决方案1】:

首先,您应该将当前的 getActors 实现更改为此。您当前的实现返回一个列表列表。这将返回一个列表。

def getActors(item_url):
    response = requests.get(item_url)
    soup = BeautifulSoup(response.content, "lxml")  # or BeautifulSoup(response.content, "html5lib")
    tempActors = []
    try:
        return(soup.find(text="Actors:").find_parent("tr").find_all(text=True)[1:])
    except AttributeError:
        return ['n/a']

然后,在将来自getActors 的多个列表收集到一个名为listOfActors 的列表中后,您可以将它们全部写入一个这样的 csv 文件

out = open('csv.csv','w')
for i in listOfActors:
    line = ''
    for j in i:
        line = line+j+','
    out.write(line+'\n')

out.close()

请使用逗号分隔值。另外,python 会自动处理 unicode 字符串。

【讨论】:

  • 我收到一个错误 - TypeError: cannot concatenate 'str' and 'list' objects
  • 投反对票的人能否发表评论?
  • @alphamonkey lxml 是最好的:D
猜你喜欢
  • 2020-04-15
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
相关资源
最近更新 更多