Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 如何为单个单元格刮取多个值_Python_List_Csv_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 如何为单个单元格刮取多个值

Python 如何为单个单元格刮取多个值,python,list,csv,web-scraping,beautifulsoup,Python,List,Csv,Web Scraping,Beautifulsoup,我想从演员名单中删掉这个名字。第一部电影《银河系漫游指南》有四个主演。他们是萨姆·洛克威尔、佐伊·德沙尼尔、亚辛·贝、马丁·弗里曼。我的代码完全可以使用星号刮取。然而,它显示的不是一部电影中四名演员的名字,而是四部电影中四名演员的名字 我的代码: headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.

我想从演员名单中删掉这个名字。第一部电影《银河系漫游指南》有四个主演。他们是萨姆·洛克威尔、佐伊·德沙尼尔、亚辛·贝、马丁·弗里曼。我的代码完全可以使用星号刮取。然而,它显示的不是一部电影中四名演员的名字,而是四部电影中四名演员的名字

我的代码:

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36", "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "DNT":"1","Connection":"close", "Upgrade-Insecure-Requests":"1"}
url= 'https://editorial.rottentomatoes.com/guide/best-sci-fi-movies-of-all-time/'
r = requests.get(url, headers=headers)#, proxies=proxies)
content = r.content
soup = BeautifulSoup(content)
name =[]
year = []
rating = []
director = []
starring = []

movies = soup.find_all('div',{'class':'article_movie_title'})
for movie in movies:
  title = movie.find('h2').find('a').text
  name.append(title)
  release = movie.find('h2').find('span', attrs={'class':'subtle start-year'}).text
  year.append(release)
  R = movie.find('h2').find('span', attrs={'class':'tMeterScore'}).text
  rating.append(R)
  for d in soup.find_all('div', attrs={'class': 'info director'}):
    for a in d.find_all('a'):
      director.append(a.string)
  for c in soup.find_all('div', attrs={'class': 'info cast'}):
    for c1 in c.find_all('a'):
      starring.append(c1.text)
我创建一个字典,然后从该字典创建一个csv表

import pandas as pd
my_dict = {'Movie_name': name,
           'Release_year': year,
           'Movie_rating': rating,
           'Director of movie': director,
           'Starring': starring }
movie_All = pd.DataFrame({ key:pd.Series(value) for key, value in my_dict.items() })
movie_All.to_csv('movies_rot.csv', index=False, encoding='utf-8')
movie_All.head()
这张桌子看起来像

         Movie_name                       Release_year  Movie_rating    Director of movie   Starring
0   The Hitchhiker's Guide to the Galaxy    (2005)    60%          Garth Jennings   Sam Rockwell,Zooey Deschanel,Yasiin Bey, Martin Freeman

看起来应该是

         Movie_name                       Release_year  Movie_rating    Director of movie   Starring
0   The Hitchhiker's Guide to the Galaxy    (2005)    60%          Garth Jennings   Sam Rockwell,Zooey Deschanel,Yasiin Bey, Martin Freeman

如何根据电影选择明星的名称?

这里的问题是,您只有一个用于主演的一维数组,因此,当为一部电影添加多个值,并且随后假设每部电影只有一名演员时,程序会认为它将用于下一部电影。您应该做的是在循环中创建一个字符串,然后将参与者名称和逗号附加到该字符串中,如下所示:

starringForThisMovie = ""
for c in soup.find_all('div', attrs={'class': 'info cast'}):
   for c1 in c.find_all('a'):
      starringForThisMovie += c1.text + ", "
starring.append(starringForThisMovie)

很抱歉对问题发生的原因进行了错误的解释。我现在想不出更好的了。

您必须循环遍历容器或div类
行倒计时项,而不是标题

movies = soup.select('.row.countdown-item')
for movie in movies:
  title = movie.select_one('h2 a').text
  name.append(title)
  release = movie.select_one('h2 .subtle').text
  year.append(release)
  R = movie.select_one('h2 .tMeterScore').text
  rating.append(R)
  # separate director name by comma
  D =  ', '.join([d.text for d in movie.select('.director a')])
  director.append(D)
  C =  ', '.join([c.text for c in movie.select('.cast a')])
  starring.append(C)

它不起作用。一部电影中会显示该明星的所有名字。假设有四部电影,第一部电影有两颗星,第二部有一颗星,第三部有三颗星,第四部有一颗星。此代码显示电影1的7颗星,电影2的7颗星,依此类推。此代码为导演和主演提供相同的输出。例如
银河系搭便车指南(2005)60%的Garth Jennings Garth Jennings
已解决?如果答案已解决,请将其标记为已接受。不,答案未解决<代码>银河系搭便车指南(2005)60%加思·詹宁斯·加思·詹宁斯无穷无尽(2018)92%贾斯汀·本森、亚伦·穆尔海德·贾斯汀·本森、亚伦·穆尔海德·洛斯·克罗诺克雷门斯(时间犯罪)(2007)89%纳乔·维加隆多·纳乔·维加隆多·阿斯特拉(2019)83%詹姆斯·格雷·詹姆斯·格雷·韦斯特沃德(1973)86%迈克尔·克莱顿迈克尔·克莱顿
正如你所看到的,每部电影的主演姓名和导演姓名都是相同的,这是一个错误的输出。我的错,应该是
主演。附加(C)
而不是
D