regular - Python TypeError en regex
scrapy python tutorial (6)
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. Use un patrón de bytes en su lugar:
linkregex = re.compile(b''<a/s*href=[/'|"](.*?)[/'"].*?>'')
^
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."
)
Esta pregunta ya tiene una respuesta aquí:
Entonces, tengo este código:
url = ''http://google.com''
linkregex = re.compile(''<a/s*href=[/'|"](.*?)[/'"].*?>'')
m = urllib.request.urlopen(url)
msg = m.read()
links = linkregex.findall(msg)
Pero luego Python devuelve este error:
links = linkregex.findall(msg)
TypeError: can''t use a string pattern on a bytes-like object
¿Qué hice mal?
Bueno, mi versión de Python no tiene un urllib con un atributo de solicitud, pero si utilizo "urllib.urlopen (url)" no obtengo una cadena, obtengo un objeto. Este es el tipo de error.
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 regulares son cadenas unicode, y se necesita el modificador b para especificar un literal de cadena de bytes:
linkregex = re.compile(b''<a/s*href=[/'|"](.*?)[/'"].*?>'')
Eso funcionó para mí en python3. Espero que esto ayude
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
Y también esto en el que agregué b antes de la expresión regular para convertirla en matriz de bytes.
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
La URL que tiene para Google no funcionó para mí, por lo que la sustituí por http://www.google.com/ig?hl=en
, que funciona para mí.
Prueba esto:
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)
Espero que esto ayude.
Si está ejecutando Python 2.6, entonces no hay ninguna "solicitud" en "urllib". Entonces la tercera línea se convierte en:
m = urllib.urlopen(url)
Y en la versión 3 debes usar esto:
links = linkregex.findall(str(msg))
Porque ''msg'' es un objeto de bytes y no una cadena como lo espera findall (). O podrías decodificar usando la codificación correcta. Por ejemplo, si "latin1" es la codificación, entonces:
links = linkregex.findall(msg.decode("latin1"))