Python 写入 csv 时出现 NameError
Python NameError when writing to csv
此 BeautifulSoup 解析器在循环打印数据时正常工作。它输出正确的东西。最后一行代码(输出到 csv)表示 user2 未定义,即使它似乎是......有什么想法吗? (谢谢大家!这是一个缩进错误,现已编辑。代码有效!)
import csv
from bs4 import BeautifulSoup
# Create output file and write headers
f = csv.writer(open('/Users/xx/Downloads/#parsed.csv', "w"), delimiter = '\t')
f.writerow(["date", "username", "tweet"]) #csv column headings
soup = BeautifulSoup(open("/Users/simonlindgren/Downloads/#raw.html")) #input html document
tweetdata = soup.find_all("div", class_="content") #find anchors of each tweet
#print tweetdata
for tweet in tweetdata:
username = tweet.find_all(class_="username js-action-profile-name")
for user in username:
user2 = user.get_text()
#print user2
date = tweet.find_all(class_="_timestamp js-short-timestamp ")
for d in date:
date2 = d.get_text()
tweet = tweet.find_all(class_="js-tweet-text tweet-text")
for t in tweet:
tweet2 = t.get_text().encode('utf-8')
tweet3 = tweet2.replace('\n', ' ')
tweet4 = tweet3.replace('\"','')
f.writerow([date2, user2, tweet4])
问题是 user2
仅在循环 for user in username:
内。一旦该循环结束,user2
将不可访问。将您的代码更改为 f.writerow([username, date, tweet])
应该可以在没有 NameError 的情况下工作,但我怀疑这段代码不会产生您想要的结果。这是因为这些值中仍将包含 HTML 代码(这就是为什么您使用 get_text()
从标签中提取数据的原因)。
相反,假设每条推文只有一个用户名、日期和推文正文,您可以将代码更改为如下内容:
tweetdata = soup.find_all("div", class_="content") #find anchors of each tweet
#print tweetdata
for tweet in tweetdata:
# pull out our data
username = tweet.find_all(class_="username js-action-profile-name")
date = tweet.find_all(class_="_timestamp js-short-timestamp ")
text = tweet.find_all(class_="js-tweet-text tweet-text")
our_data = tuple(username[0].get_text(), date[0].get_text(),
text[0].get_text().encode('utf-8'))
print "User: %s - Date: %s - Text: %s" % our_data
# write to CSV
f.writerow(our_data)
这避免了使用不必要的 for
循环(因为每条推文无论如何都只有一个用户名、日期和正文)。如果您需要将其写成列表,请将 our_data
从元组更改为列表。
此 BeautifulSoup 解析器在循环打印数据时正常工作。它输出正确的东西。最后一行代码(输出到 csv)表示 user2 未定义,即使它似乎是......有什么想法吗? (谢谢大家!这是一个缩进错误,现已编辑。代码有效!)
import csv
from bs4 import BeautifulSoup
# Create output file and write headers
f = csv.writer(open('/Users/xx/Downloads/#parsed.csv', "w"), delimiter = '\t')
f.writerow(["date", "username", "tweet"]) #csv column headings
soup = BeautifulSoup(open("/Users/simonlindgren/Downloads/#raw.html")) #input html document
tweetdata = soup.find_all("div", class_="content") #find anchors of each tweet
#print tweetdata
for tweet in tweetdata:
username = tweet.find_all(class_="username js-action-profile-name")
for user in username:
user2 = user.get_text()
#print user2
date = tweet.find_all(class_="_timestamp js-short-timestamp ")
for d in date:
date2 = d.get_text()
tweet = tweet.find_all(class_="js-tweet-text tweet-text")
for t in tweet:
tweet2 = t.get_text().encode('utf-8')
tweet3 = tweet2.replace('\n', ' ')
tweet4 = tweet3.replace('\"','')
f.writerow([date2, user2, tweet4])
问题是 user2
仅在循环 for user in username:
内。一旦该循环结束,user2
将不可访问。将您的代码更改为 f.writerow([username, date, tweet])
应该可以在没有 NameError 的情况下工作,但我怀疑这段代码不会产生您想要的结果。这是因为这些值中仍将包含 HTML 代码(这就是为什么您使用 get_text()
从标签中提取数据的原因)。
相反,假设每条推文只有一个用户名、日期和推文正文,您可以将代码更改为如下内容:
tweetdata = soup.find_all("div", class_="content") #find anchors of each tweet
#print tweetdata
for tweet in tweetdata:
# pull out our data
username = tweet.find_all(class_="username js-action-profile-name")
date = tweet.find_all(class_="_timestamp js-short-timestamp ")
text = tweet.find_all(class_="js-tweet-text tweet-text")
our_data = tuple(username[0].get_text(), date[0].get_text(),
text[0].get_text().encode('utf-8'))
print "User: %s - Date: %s - Text: %s" % our_data
# write to CSV
f.writerow(our_data)
这避免了使用不必要的 for
循环(因为每条推文无论如何都只有一个用户名、日期和正文)。如果您需要将其写成列表,请将 our_data
从元组更改为列表。