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.urlopenbytes(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 に答える