如何存储BeautifulSoup中find_all函数的结果

时间:2019-01-30 03:28:36

标签: python beautifulsoup

我想获取find_all结果的文本,但是为什么当我将文本存储在for循环中时,它仍然包含所有标记?

import requests
from bs4 import BeautifulSoup
import csv

f = csv.writer(open('imdb-films', 'w'))
f.writerow(['Rank','Movie-name', 'Year', 'Score', 'Director'])

url = 'https://www.imdb.com/search/title?title_type=feature&release_date=2018-01-01,2018-12-31&ref_=adv_prv'

contents = requests.get(url)
soup = BeautifulSoup(contents.text, 'lxml')

rank = soup.find('div', class_ = 'lister-list')

print(rank.prettify())

for rank in rank.find_all('span', class_="lister-item-index unbold text-primary"):
     rank_list = rank.text

如果我将for循环更改为以下内容,那么它将起作用。

 for rank in rank.find_all('span', class_="lister-item-index unbold text-primary"):
     print rank.text

它产生我想要的结果;我只希望将打印出的数字存储在变量中,作为列表或数组

我根据以下答案修改了代码后,上述问题得以解决。谢谢!!

但是现在我遇到了一个新问题。

director_list = []


for director in rank.find_all('p', class_ = ""):
    director_next = director.a.text
    director_list.append(director_next)

print(director_list)

此代码生成以下输出:

AttributeError: 'NoneType' object has no attribute 'text'

我不知道为什么“ director_next = director.a”会生成一个none类型,以及如何解决该问题以提取Directors的名称。

2 个答案:

答案 0 :(得分:0)

您可以使用get_text()函数,并且应该首先创建一个list

尝试一下:

import requests
from bs4 import BeautifulSoup
import csv

f = csv.writer(open('imdb-films', 'w')) 
f.writerow(['Rank','Movie-name', 'Year', 'Score', 'Director'])

url = 'https://www.imdb.com/search/title?title_type=feature&release_date=2018-01-01,2018-12-31&ref_=adv_prv'

contents = requests.get(url)
soup = BeautifulSoup(contents.text, 'lxml')

rank = soup.find('div', class_ = 'lister-list')

print(rank.prettify())

rank_list=[]
for rank in rank.find_all('span', class_="lister-item-index unbold text-primary"): 
    rank_list.append(rank.get_text())

顺便说一句,请重写您的问题,它看起来很困惑。

答案 1 :(得分:0)

您似乎可以这样做:

span_list = rank.find_all('span', class_="lister-item-index unbold text-primary")
result_list = [i.text.strip() for i in span_list]

您还可以将字符串转换为float:

result_list = [float(i.text.strip()) for i in span_list]