繁体   English   中英

Python 3中的re.findall

[英]re.findall in Python 3

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

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对象,则这很有用。

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

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

或者,您可以编译字节正则表达式:

re.compile(b"yourpatternhere")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM