我写了一个小脚本来使用collins网站进行翻译。继承我的代码:
import urllib.request
import re
def translate(search):
base_url = 'http://www.collinsdictionary.com/dictionary/american/'
url = base_url + search
p = urllib.request.urlopen(url).read()
f = open('t.txt', 'w+b')
f.write(p)
f.close()
f = open('t.txt', 'r')
t = f.read()
m = re.search(r'(<span class="def">)(\w.*)(</span>]*)',t)
n = m.group(2)
print(n)
f.close()
我有一些问题:
我不能在p上使用re.search。它引发了这个错误:
TypeError: can't use a string pattern on a bytes-like object
有没有一种方法可以使用re.search
而不保存它?
保存文件后我应重新打开它以使用re.search,否则会引发此错误:TypeError: must be str, not bytes
为什么会出现此错误?
在这个程序中我想从第一场比赛中<span class="def"> and </span>
之间提取信息。但是我写的模式并不适用于所有情况。例如翻译('三')是好的。 out put是:“总共超过两个”但是对于翻译('tree')输出是:
“树木丛生或灌木丛''玫瑰树'
有没有办法纠正这种模式。正则表达式或任何其他工具?
答案 0 :(得分:0)
当您对read
返回的响应调用urllib
时,会得到一个bytes
对象,需要对其进行解码才能将其转换为字符串。
更改
p=urllib.request.urlopen(url).read()
到
p=urllib.request.urlopen(url).read().decode('utf-8')
你应该阅读这个https://docs.python.org/3/howto/unicode.html来理解为什么,因为这样的问题会出现很多。
此外,you probably don't want to parse HTML using regex。提到了一些更好的Python替代方案here。