Python TypeError на регулярном выражении [дубликат]
этот вопрос уже есть ответ здесь:
- TypeError: не удается использовать шаблон строки для байт-подобного объекта в re.метод findAll() 2 ответы
Итак, у меня есть этот код:
url = 'http://google.com'
linkregex = re.compile('<as*href=['|"](.*?)['"].*?>')
m = urllib.request.urlopen(url)
msg = m.read()
links = linkregex.findall(msg)
но затем python возвращает эту ошибку:
links = linkregex.findall(msg)
TypeError: can't use a string pattern on a bytes-like object
что я сделал не так?
6 ответов:
TypeError: can't use a string pattern
on a bytes-like object
что я сделал не так??
вы использовали строковый шаблон для объекта bytes. Вместо этого используйте шаблон байтов:
linkregex = re.compile(b'<a\s*href=[\'|"](.*?)[\'"].*?>') ^ Add the b there, it makes it into a bytes object
(ps:
>>> from disclaimer include dont_use_regexp_on_html "Use BeautifulSoup or lxml instead."
)
Если вы используете Python 2.6, то в" urllib "нет никакого"запроса". Итак, третья строка становится:
m = urllib.urlopen(url)
и в версии 3, Вы должны использовать это:
links = linkregex.findall(str(msg))
потому что ' msg ' - это объект bytes, а не строка, как ожидает findall (). Или вы можете декодировать, используя правильную кодировку. Например, если" latin1 " является кодировкой, то:
links = linkregex.findall(msg.decode("latin1"))
Ну, моя версия Python не имеет urllib с атрибутом запроса, но если я использую "urllib.urlopen (url)" я не получаю обратно строку, я получаю объект. Это ошибка типа.
url, который у вас есть для Google, не работал для меня, поэтому я заменил
http://www.google.com/ig?hl=en
для него, который работает для меня.попробуйте это:
import re import urllib.request url="http://www.google.com/ig?hl=en" linkregex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?>') m = urllib.request.urlopen(url) msg = m.read(): links = linkregex.findall(str(msg)) print(links)
надеюсь, что это помогает.
шаблон регулярного выражения и строки должны быть одного типа. Если вы сопоставляете обычную строку, вам нужен шаблон строки. Если вы сопоставляете строку байтов, вам нужен шаблон байтов.
в этом случае m. read () возвращает строку байтов, поэтому вам нужен шаблон байтов. В Python 3 обычные строки являются строками unicode, и вам нужно b модификатор для указания байта строкового литерала:
linkregex = re.compile(b'<a\s*href=[\'|"](.*?)[\'"].*?>')
это сработало для меня в python3. Надеюсь, это поможет
import urllib.request import re urls = ["https://google.com","https://nytimes.com","http://CNN.com"] i = 0 regex = '<title>(.+?)</title>' pattern = re.compile(regex) while i < len(urls) : htmlfile = urllib.request.urlopen(urls[i]) htmltext = htmlfile.read() titles = re.search(pattern, str(htmltext)) print(titles) i+=1
а также это, в котором я добавил b перед регулярным выражением, чтобы преобразовать его в массив байтов.
import urllib.request import re urls = ["https://google.com","https://nytimes.com","http://CNN.com"] i = 0 regex = b'<title>(.+?)</title>' pattern = re.compile(regex) while i < len(urls) : htmlfile = urllib.request.urlopen(urls[i]) htmltext = htmlfile.read() titles = re.search(pattern, htmltext) print(titles) i+=1