我一直在制作一个程序来浏览我已经保存在文本文件中的各种链接,这些链接主要是夏天的机会/阵营/等等。并通过他们来看看是否弹出了像“奖学金”或“经济援助”这样的关键词。但是,当我浏览它时,它会给我上面标题中的错误。
这个问题已被问过几次,但对于不同的人来说,这似乎是出于不同的原因。因此,我知道可能存在涉及Unicode的错误,但我不知道它会在何处或原因。
这是代码:
import BeautifulSoup
import requests
import nltk
file_from = open("links.txt", "r")
list_of_urls = file_from.read().splitlines()
aid_words = ["financial", "aid", "merit", "scholarship"]
count = 0
fin_aid = []
while count <= 10:
for url in list_of_urls:
clean = 1
result = "nothing found"
source = requests.get(url)
plain_text = source.text
soup = BeautifulSoup.BeautifulSoup(plain_text)
print (str(url).upper())
for links in soup.findAll('p', text = True):
tokenized_text = nltk.word_tokenize(links)
for word in tokenized_text:
if word not in aid_words:
print ("not it " + str(clean))
clean += 1
pass
else:
result = str(word)
print (result)
fin_aid.append(url)
break
count += 1
the_golden_book = {"link: ": str(url), "word found: ": str(result)}
fin_aid.append(the_golden_book)
file_to = open("links_with_aid.txt", "w")
file_to.write(str(fin_aid))
file_to.close()
print ("scrape finished")
print (str(fin_aid))
基本上,我想从links.txt获取所有链接,访问前十个(作为测试),搜索列表“aid_words”中的四个单词,并以“not it”的形式返回结果到目前为止搜索到的单词数,如果还没有找到任何单词,或者找到一个单词被检测到(这样我以后可以访问该链接并搜索它,看看它是否是误报警或不)。
当我通过命令提示符运行时,这是它在错误消息之前显示的内容。
Traceback (most recent call last):
File "finaid.py", line 20, in <module>
soup = BeautifulSoup.BeautifulSoup(plain_text.encode("utf-8"))
File "C:\Python27\lib\site-packages\BeautifulSoup.py", line 1522, in __init__
BeautifulStoneSoup.__init__(self, *args, **kwargs)
File "C:\Python27\lib\site-packages\BeautifulSoup.py", line 1147, in __init__
self._feed(isHTML=isHTML)
File "C:\Python27\lib\site-packages\BeautifulSoup.py", line 1189, in _feed
SGMLParser.feed(self, markup)
File "C:\Python27\lib\sgmllib.py", line 104, in feed
self.goahead(0)
File "C:\Python27\lib\sgmllib.py", line 143, in goahead
k = self.parse_endtag(i)
File "C:\Python27\lib\sgmllib.py", line 320, in parse_endtag
self.finish_endtag(tag)
File "C:\Python27\lib\sgmllib.py", line 358, in finish_endtag
method = getattr(self, 'end_' + tag)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-9: ordin
al not in range(128)
我在Python 2.7.10上运行它,我在Windows 8.1上。感谢您的任何帮助,您可以提供!据我所知,它不应该是“link.txt”中的任何内容,它实际上只是一个同事抓取并保存的链接。
答案 0 :(得分:1)
我做了很多网站抓取,我可以告诉你:请尝试使用Python 3编写你的刮刀代码。一旦我更新了我的刮刀使用Python 3,我的很多编码问题就消失了。如果你去Python 3并且你想保持该文件的内容不变,请确保你的文件写入使用'a'而不是'w'。
如果您对进行此转换有任何具体问题,请与我们联系。
在“预期的字符串或缓冲区”上,当我传入一个对象而不是一个字符串时,它通常会显示给我。要检查是否发生这种情况,请使用print语句进行检查,如下所示:
for links in soup.findAll('p', text = True):
print(links)
tokenized_text = nltk.word_tokenize(links)
如果它不向您的终端打印文本(或者您从哪里运行脚本),那么当您希望接收字符串时,您将传入一个对象。
修复它的伪代码可能如下所示:
for links in soup.findAll('p', text = True):
links = links.text()
tokenized_text = nltk.word_tokenize(links)