我正在尝试废弃网页。为了保持除ASCII以外的所有字符,我已经编写了这段代码。
mydata = ''.join([i if ord(i) < 128 else ' ' for i in response.text])
使用美丽的汤蟒蛇库进一步加工。现在这不是处理网页上的一些特殊字符,如[tick],[star](这里不能显示图片)。 有关如何转义这些字符并用空格替换它们的任何线索。 现在我有这个错误
UnicodeEncodeError: 'charmap' codec can't encode character '\u2713' in position 62: character maps to <undefined>
答案 0 :(得分:2)
fp = open("output.txt","w")
为您提供一个文件,用于使用默认编码打开文本,在您的情况下,这是一个没有字符✓
(可能是cp1252)的编码,因此出错。使用支持它的编码打开文件,你会没事的:
fp = open('output.txt', 'w', encoding='utf-8')
另请注意:
print("result: "+ str(ele))
如果您的控制台不支持Unicode,可能会失败,在Windows下它可能不会。使用print(ascii(...))
获取ASCII安全表示以进行调试。
您尝试摆脱非ASCII字符失败的可能原因是您在解析HTML之前将其删除,而不是从解析后获得的值中删除它们。因此,文字✓
将被删除,但如果使用了✓
之类的字符引用,它将保持不变,由bs4解析,最终为✓
。
(我很遗憾,对Unicode错误的默认反应似乎总是试图完全摆脱非ASCII字符,而不是修复代码以正确处理它们。)
您还以非常奇怪的方式提取文本,使用str()
获取标记,然后尝试挑选标记并将其删除。这是不可靠的 - HTML并不是那么容易解析,这就是为什么BeautifulSoup是一个东西 - 而且是不必要的,因为你已经拥有了一个非常好的HTML解析器,它可以为你提供元素中的纯文本(get_text()
)。 / p>
答案 1 :(得分:0)
始终最好以Unicode格式处理所有内容,并仅在存储或传输之前转换为任何特定编码。例如,
s = u“嗨,привет,ciao”
> s
u'Hi, \u043f\u0440\u0438\u0432\u0435\u0442, ciao'
> s.encode('ascii', 'ignore')
'Hi, , ciao'
> s.encode('ascii', 'replace')
'Hi, ??????, ciao'
如果您需要专门用空格替换非ascii字符,您可以编写并注册自己的转换错误处理程序,请参阅codecs.register_error()
。
答案 2 :(得分:0)
您的大部分代码都不是必需的。请求已经为你做了正确的解码,beautifulsoup正在为你做文本提取,python正在为你写一个正确的编码:
import requests
from bs4 import BeautifulSoup
#keyterm = input("Enter a keyword to search:")
URL = 'https://www.google.com/search?q=jaguar&num=30'
#NO_OF_LINKS_TO_BE_EXTRACTED = 10
print("Requesting data from %s" % URL)
response = requests.get(URL)
soup = BeautifulSoup(response.text)
#print(soup.prettify())
metaM = soup.findAll("span","st")
#metaM = soup.find("div", { "class" : "f slp" })
with open("output.txt", "w", encoding='utf8') as fp:
for ele in metaM:
print("result: %r" % ele)
fp.write(ele.get_text().replace('\n', ' ') + '\n')