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 51

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