1. ホーム
  2. python

_compile(pattern, flags).findall(string) TypeError: cannot use string pattern on the bytes-like

2022-02-18 23:09:47
<パス

最近pythonを独学で勉強していて、画像クローラーを作ったのですが、いくつかエラーが出たので、他の人が同じエラーに遭遇した時にすぐに解決できるようにまとめています。

#coding=utf-8
import urllib
import urllib.request
import re

url = "http://tieba.baidu.com/p/2460150866"
page = urllib.request.urlopen(url)
html = page.read()
print(html)    

# regular match
reg = r'src="(. +? \.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
print("start dowload pic")
for imgurl in imglist:
    print(imgurl)
    resp = urllib.request.urlopen(imgurl)
    respHtml = resp.read()
    picFile = open('%s.jpg' % x, "wb")
    picFile.write(respHtml)
    picFile.close()
    x = x+1
print("done")


エラーメッセージは以下の通りです。

File "C:\Python35libre.py" line 213, in findall

return _compile(pattern, flags).findall(string)

TypeError: bytes-like オブジェクトで文字列パターンを使用することはできません。

エラーの主な原因は、以下の通りです。

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

html を decode('utf-8') でデコードし、bytes から string に変更します。

py3のurlopenは文字列ではなく、バイトを返します。

解決策は html' タイプをいじる: html.decode('utf-8')

正しいコードは以下の通りです。

#coding=utf-8
import urllib
#In python 3.3, use urllib.request instead of urllib2
import urllib.request
import re

url = "http://tieba.baidu.com/p/2460150866"
page = urllib.request.urlopen(url)
html = page.read()
print(html) #python3 can only use print(html) python2 can write print html

#regular match
reg = r'src="(. +? \.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre, html.decode('utf-8'))
x = 0
print("start dowload pic")
for imgurl in imglist:
    print(imgurl)
    resp = urllib.request.urlopen(imgurl)
    respHtml = resp.read()
    picFile = open('%s.jpg' % x, "wb")
    picFile.write(respHtml)
    picFile.close()
    x = x+1
print("done")