una scraping pagina mercado libre hacer extraer examples ejemplo datos con como python regex url

scraping - ¿Cuál es la forma más limpia de extraer URL de una cadena usando Python?



web scraping mercado libre (10)

Hay una excelente comparación de 13 enfoques diferentes de expresiones regulares

... que se puede encontrar en esta página: en busca de la validación de URL perfecta regex .

La regex de Diego Perini, que pasó todas las pruebas, es muy larga, pero está disponible en su esencia here .
Tenga en cuenta que deberá convertir su versión de PHP a python regex (hay ligeras diferencias).

Terminé usando la versión Imme Emosol que pasa la gran mayoría de las pruebas y es una fracción del tamaño de Diego Perini.

Aquí hay una versión compatible con Python de Imme Emosol regex:

r''^(?:(?:https?|ftp)://)(?:/S+(?::/S*)?@)?(?:(?:[1-9]/d?|1/d/d|2[01]/d|22[0-3])(?:/.(?:1?/d{1,2}|2[0-4]/d|25[0-5])){2}(?:/.(?:[1-9]/d?|1/d/d|2[0-4]/d|25[0-4]))|(?:(?:[a-z/u00a1-/uffff0-9]+-?)*[a-z/u00a1-/uffff0-9]+)(?:/.(?:[a-z/u00a1-/uffff0-9]+-?)*[a-z/u00a1-/uffff0-9]+)*(?:/.(?:[a-z/u00a1-/uffff]{2,})))(?::/d{2,5})?(?:/[^/s]*)?$''

Aunque sé que podría usar un regex de gran tamaño como el que se publica here , me pregunto si hay alguna manera inteligente de hacer esto con un módulo estándar o quizás un complemento de terceros.

Pregunta simple, pero nada saltó en Google (o Stackoverflow).

¡Espero ver cómo hacen esto!


Hay otra manera de extraer URLs del texto fácilmente. Puede usar urlextract para hacerlo por usted, simplemente instálelo a través de pip:

pip install urlextract

y luego puedes usarlo así:

from urlextract import URLExtract extractor = URLExtract() urls = extractor.find_urls("Let''s have URL .com as an example.") print(urls) # prints: [''.com'']

Puede encontrar más información en mi página de github: https://github.com/lipoja/URLExtract

NOTA: descarga la lista de TLDs de iana.org para mantenerlo actualizado. Pero si el programa no tiene acceso a Internet, entonces no es para ti.

Este enfoque es similar al de urlextractor (mencionado anteriormente), pero mi código es reciente, mantenido y estoy abierto a cualquier sugerencia (nuevas características).


Llego tarde a la fiesta, pero esta es una solución que me sugirió alguien de #python en freenode. Evita la molestia regex.

from urlparse import urlparse def extract_urls(text): """Return a list of urls from a text string.""" out = [] for word in text.split('' ''): thing = urlparse(word.strip()) if thing.scheme: out.append(word) return out


Puedes usar BeautifulSoup .

def extractlinks(html): soup = BeautifulSoup(html) anchors = soup.findAll(''a'') links = [] for a in anchors: links.append(a[''href'']) return links

Tenga en cuenta que la solución con expresiones regulares es más rápida, aunque no será tan precisa.


Puedes usar esta biblioteca que escribí:

https://github.com/imranghory/urlextractor

Es extremadamente raro, pero no depende de "http: //" como muchas otras técnicas, sino que utiliza la lista de TLD de Mozilla (a través de la biblioteca tldextract) para buscar TLD (es decir, ".co.uk", ". com ", etc.) en el texto y luego intenta construir urls en todo el TLD.

No pretende ser compatible con RFC, sino más bien preciso sobre cómo se usan las urls en la práctica en el mundo real. Por ejemplo, rechazará el dominio técnicamente válido "com" (en realidad, puede usar un dominio de nivel superior como dominio, aunque es raro en la práctica) y quitará rastros de paradas completas o comas de las direcciones URL.


Sé que es exactamente lo que no quieres, pero aquí hay un archivo con una enorme expresión regular:

#!/usr/bin/python # -*- coding: utf-8 -*- """ the web url matching regex used by markdown http://daringfireball.net/2010/07/improved_regex_for_matching_urls https://gist.github.com/gruber/8891611 """ URL_REGEX = r"""(?i)/b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9./-]+[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)/)(?:[^/s()<>{}/[/]]+|/([^/s()]*?/([^/s()]+/)[^/s()]*?/)|/([^/s]+?/))+(?:/([^/s()]*?/([^/s()]+/)[^/s()]*?/)|/([^/s]+?/)|[^/s`!()/[/]{};:''".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[./-][a-z0-9]+)*[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)/b/?(?!@)))"""

Llamo a ese archivo urlmarker.py y cuando lo necesito solo lo importo, ej.

import urlmarker import re re.findall(urlmarker.URL_REGEX,''some text news.yahoo.com more text'')

cf. daringfireball.net/2010/07/improved_regex_for_matching_urls

Además, esto es lo que Django (1.6) usa para validar URLField s:

regex = re.compile( r''^(?:http|ftp)s?://'' # http:// or https:// r''(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?/.)+(?:[A-Z]{2,6}/.?|[A-Z0-9-]{2,}/.?)|'' # domain... r''localhost|'' # localhost... r''/d{1,3}/./d{1,3}/./d{1,3}/./d{1,3}|'' # ...or ipv4 r''/[?[A-F0-9]*:[A-F0-9:]+/]?)'' # ...or ipv6 r''(?::/d+)?'' # optional port r''(?:/?|[/?]/S+)$'', re.IGNORECASE)

cf. https://github.com/django/django/blob/1.6/django/core/validators.py#L43-50

Django 1.9 tiene esa lógica dividida en unas pocas clases


Usa una expresión regular.

Responder al comentario del OP: sé que esto no es útil. Te estoy diciendo la forma correcta de resolver el problema, como dijiste que es usar una expresión regular.


si sabe que hay una URL siguiendo un espacio en la cadena, puede hacer algo como esto:

s es la cadena que contiene la url

>>> t = s[s.find("http://"):] >>> t = t[:t.find(" ")]

de lo contrario, debe verificar si encuentra devoluciones -1 o no.


Mira el enfoque de Django aquí: django.utils.urlize() . Las expresiones regulares son demasiado limitadas para el trabajo y debe utilizar la heurística para obtener resultados que son en su mayoría correctos.


import re text = ''<p>Please click <a href="http://www.dr-chuck.com">here</a></p>'' aa=re.findall(''href="(.+)"'',text) print(aa)