2

我想使用函数 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
4

3 回答 3

6

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整个代码中使用对象,这将很有用。

于 2013-05-18T20:39:11.417 回答
2

您需要先解码字节对象:

data = urlopen(url).read()
webpage = data.decode('utf-8')  #converts `bytes` to `str`
findrows.findall(webpage)
于 2013-05-18T20:36:47.847 回答
0

或者你可以编译一个字节正则表达式:

re.compile(b"yourpatternhere")
于 2013-05-18T21:02:32.743 回答