正则表达式上的Python TypeError

这个问题已经在这里有了答案:

  • TypeError:无法在re.findall()中的类似字节的对象上使用字符串模式                                     2个答案

所以,我有这段代码:

url = 'http://google.com'
linkregex = re.compile('<a\s*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

我做错了什么?

kamikaze_pilot asked 2020-01-24T11:30:14Z
6个解决方案
70 votes

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

我做错了什么??

您在字节对象上使用了字符串模式。 请改用字节模式:

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."

Lennart Regebro answered 2020-01-24T11:30:52Z
3 votes

如果您正在运行Python 2.6,则“ urllib”中没有任何“请求”。 因此,第三行变为:

m = urllib.urlopen(url) 

在版本3中,您应该使用以下代码:

links = linkregex.findall(str(msg))

因为“ msg”是一个字节对象,而不是findall()期望的字符串。 或者,您可以使用正确的编码进行解码。 例如,如果“ latin1”是编码,则:

links = linkregex.findall(msg.decode("latin1"))
Morten Kristensen answered 2020-01-24T11:31:21Z
1 votes

好吧,我的Python版本没有带request属性的urllib,但是如果我使用“ urllib.urlopen(url)”,我不会返回字符串,而是得到一个对象。 这是类型错误。

Jeremy Whitlock answered 2020-01-24T11:31:41Z
1 votes

您为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)

希望这可以帮助。

John answered 2020-01-24T11:32:09Z
1 votes

正则表达式模式和字符串必须具有相同的类型。 如果要匹配常规字符串,则需要一个字符串模式。 如果要匹配字节字符串,则需要字节模式。

在这种情况下,m.read()返回一个字节字符串,因此您需要一个字节模式。 在Python 3中,常规字符串是unicode字符串,并且您需要b修饰符来指定字节字符串文字:

linkregex = re.compile(b'<a\s*href=[\'|"](.*?)[\'"].*?>')
Seppo Enarvi answered 2020-01-24T11:32:34Z
0 votes

在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
answered 2020-01-24T11:32:59Z
translate from https://stackoverflow.com:/questions/5184483/python-typeerror-on-regex