Python TypeError en regex

Por lo tanto, tengo este código:

url = 'http://google.com' linkregex = re.compile('') m = urllib.request.urlopen(url) msg = m.read() links = linkregex.findall(msg) 

Pero entonces Python devuelve este error:

 links = linkregex.findall(msg) TypeError: can't use a string pattern on a bytes-like object 

¿Qué hice mal?

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

¿¿qué hice mal??

Usaste un patrón de cadena en un objeto de bytes. Utilice un patrón de bytes en su lugar:

 linkregex = re.compile(b'') ^ Add the b there, it makes it into a bytes object 

(PD:

  >>> from disclaimer include dont_use_regexp_on_html "Use BeautifulSoup or lxml instead." 

)

Si está ejecutando Python 2.6, no hay ninguna “solicitud” en “urllib”. Entonces la tercera línea se convierte en:

 m = urllib.urlopen(url) 

Y en la versión 3 deberías usar esto:

 links = linkregex.findall(str(msg)) 

Debido a que ‘msg’ es un objeto de bytes y no una cadena como findall () espera. O podrías decodificar usando la encoding correcta. Por ejemplo, si “latin1” es la encoding, entonces:

 links = linkregex.findall(msg.decode("latin1")) 

Bueno, mi versión de Python no tiene un urllib con un atributo de solicitud, pero si uso “urllib.urlopen (url)” no recupero una cadena, obtengo un objeto. Este es el error de tipo.

La url que tienes para Google no funcionó para mí, así que sustituí http://www.google.com/ig?hl=en por lo que funciona para mí.

Prueba esto:

 import re import urllib.request url="http://www.google.com/ig?hl=en" linkregex = re.compile('') m = urllib.request.urlopen(url) msg = m.read(): links = linkregex.findall(str(msg)) print(links) 

Espero que esto ayude.

El patrón de expresión regular y la cadena deben ser del mismo tipo. Si está haciendo coincidir una cadena normal, necesita un patrón de cadena. Si está haciendo coincidir una cadena de bytes, necesita un patrón de bytes.

En este caso m.read () devuelve una cadena de bytes, por lo que necesita un patrón de bytes. En Python 3, las cadenas normales son cadenas Unicode, y necesitas el modificador b para especificar un literal de cadena de bytes:

 linkregex = re.compile(b'') 

Eso me funcionó en python3. Espero que esto ayude

 import urllib.request import re urls = ["https://google.com","https://nytimes.com","http://CNN.com"] i = 0 regex = '(.+?)' 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 

Y también esto en el que agregué b antes de las expresiones regulares para convertirlo en una matriz de bytes.

 import urllib.request import re urls = ["https://google.com","https://nytimes.com","http://CNN.com"] i = 0 regex = b'(.+?)' 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