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