在Python 3中re.findall

时间:2013-05-18 20:28:53

标签: python regex web

我想使用函数re.findall(),它在网页中搜索特定模式:

from urllib.request import Request, urlopen
import re


url = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/20.0.1'})
webpage = urlopen(url).read()

findrows = re.compile('<td class="cmeTableCenter">(.*)</td>')
row_array = re.findall(findrows, webpage) #ERROR HERE

我收到错误:

TypeError: can't use a string pattern on a bytes-like object

3 个答案:

答案 0 :(得分:5)

urllib.request.urlopen返回bytes个对象,而不是(Unicode)字符串。在尝试匹配任何内容之前,您应该解码它。例如,如果您知道您的页面是UTF-8:

webpage = urlopen(url).read().decode('utf8')

更好的HTTP库会自动为您执行此操作,但确定正确的编码并不总是微不足道甚至可能,因此Python的标准库不会。

另一个选择是使用bytes正则表达式:

findrows = re.compile(b'<td class="cmeTableCenter">(.*)</td>')

如果您不知道编码,并且不介意在整个代码中使用bytes个对象,这将非常有用。

答案 1 :(得分:2)

您需要首先解码字节对象:

data = urlopen(url).read()
webpage = data.decode('utf-8')  #converts `bytes` to `str`
findrows.findall(webpage)

答案 2 :(得分:0)

备选你可以编译一个字节regexp:

re.compile(b"yourpatternhere")