Tengo un conjunto de enlaces como:
['http://www.nytimes.com/2016/12/31/us/politics/house-republicans-health-care-suit.html?partner=rss&emc=rss" rel="standout">', 'http://www.nytimes.com/2016/12/31/nyregion/bronx-murder-40th-precinct-police-residents.html', 'http://www.nytimes.com/2016/12/30/movies/tyrus-wong-dies-bambi-disney.html?partner=rss&emc=rss', 'http://www.nytimes.com/2016/12/30/obituaries/among-deaths-in-2016-a-heavy-toll-in-pop-music.html', 'http://www.nytimes.com/video/world/100000004830728/daybreak-around-the-world.html?partner=rss&emc=rss']
Estoy tratando de iterar sobre ellos para eliminar todo lo que viene después de html
. Así que tengo:
cleanitems = [] for item in links: cleanitems.append(re.sub(r'html(.*)', '', item))
Que devuelve:
['http://www.nytimes.com/2016/12/31/us/politics/house-republicans-health-care-suit.', 'http://www.nytimes.com/2016/12/31/nyregion/bronx-murder-40th-precinct-police-residents.', 'http://www.nytimes.com/2016/12/30/movies/tyrus-wong-dies-bambi-disney.', 'http://www.nytimes.com/2016/12/30/obituaries/among-deaths-in-2016-a-heavy-toll-in-pop-music.', 'http://www.nytimes.com/video/world/100000004830728/daybreak-around-the-world.]
Confundido en cuanto a por qué está incluyendo html
en el grupo de captura. Gracias por cualquier ayuda.
html
forma parte del texto coincidente, no solo del grupo (...)
. re.sub()
reemplaza todo el texto combinado completo.
Incluya el texto literal html
en el reemplazo:
cleanitems.append(re.sub(r'html(.*)', 'html', item))
o, alternativamente, captura esa parte en un grupo en su lugar:
cleanitems.append(re.sub(r'(html).*', r'\1', item))
Es posible que desee considerar el uso de una coincidencia no codiciosa y un ancla de $
fin de cadena para evitar cortar una URL que contiene html
en la ruta más de una vez, e incluir la .
punto para asegurarse de que realmente solo coincida con la extensión .html
:
cleanitems.append(re.sub(r'\.html.*?$', r'.html', item))
Sin embargo, si su objective es eliminar la cadena de consulta de una URL, considere analizar la URL usando urllib.parse.urlparse()
, y vuelva a urllib.parse.urlparse()
sin la cadena de consulta o los identificadores de fragmentos:
from urlib.parse import urlparse cleanitems.append(urlparse(item)._replace(query='', fragment='').geturl())
Sin embargo, esto no eliminará los fragmentos HTML erróneos; Si está analizando estas URL de un documento HTML, considere usar un analizador HTML real en lugar de expresiones regulares.
Solo un complemento a la respuesta de Martijn.
También puede usar una aserción de búsqueda para que solo coincida con el texto que sigue a html
:
cleanitems.append(re.sub(r'(?<=html).*', '', item))
o use una cadena de reemplazo para mantener la parte inicial:
cleanitems.append(re.sub(r'(html).*', r'\1', item))
Pero como ya dijo Martin, es mejor que uses el módulo urllib para analizar correctamente las URL