如何在python中使用re模块提取信息?

时间:2015-02-27 09:40:18

标签: python html regex

我写了一个小脚本来使用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()

我有一些问题:

  1. 我不能在p上使用re.search。它引发了这个错误: TypeError: can't use a string pattern on a bytes-like object 有没有一种方法可以使用re.search而不保存它?

  2. 保存文件后我应重新打开它以使用re.search,否则会引发此错误:TypeError: must be str, not bytes为什么会出现此错误?

  3. 在这个程序中我想从第一场比赛中<span class="def"> and </span>之间提取信息。但是我写的模式并不适用于所有情况。例如翻译('三')是好的。 out put是:“总共超过两个”但是对于翻译('tree')输出是: “树木丛生或灌木丛''玫瑰树' 有没有办法纠正这种模式。正则表达式或任何其他工具?

1 个答案:

答案 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