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 从元组更改为列表。