我想使用函数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
答案 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")