Alex Dario Portilla Chungandro
PreguntaPor alguna razón mi codigo corre sin ningun error, pero al momento que me crea la carpeta que es donde se supone que se guardaran los archivos .txt estos no aparecen, la carpeta queda totalmente vacía. Alguien sabe como solucionarlo??. Les dejo mi codigo
import requests import lxml.html as html import os import datetime HOME_URL = 'https://www.larepublica.co/' XPATH_LINK_TO_ARTICLE = '//div/h2/a/@href' XPATH_TITLE = '//h2[@style="font-size: 49px; line-height: 53px;"]/a/text()' XPATH_SUMMARY = '//div[@class="lead"]/p/text()' XPATH_BODY = '//div[@class="autoArticle" or @class="html-content"]/p/text()' def parse_notice(link, today): try: response= requests.get(link) if response.status_code == 200: notice = response.content.decode('utf-8') parsed = html.fromstring(notice) try: title = parsed.xpath(XPATH_TITLE)[0] title = title.replace('\"','') summary = parsed.xpath(XPATH_SUMMARY)[0] body = parsed.xpath(XPATH_BODY) except IndexError: return with open(f'{today}/{title}.txt', 'w', encoding='utf-8') as f: f.write(title) f.write('\n\n') f.write(summary) f.write('\n\n') for p in body: f.write(p) f.write('\n') else: raise ValueError(f'Error: {response.status_code}') except ValueError as ver: print(ve) def parse_home(): try: response = requests.get(HOME_URL) if response.status_code == 200: home = response.content.decode('utf-8') parsed = html.fromstring(home) links_to_notices = parsed.xpath(XPATH_LINK_TO_ARTICLE) today = datetime.date.today().strftime('%d-%m-%Y') if not os.path.isdir(today): os.mkdir(today) for link in links_to_notices: parse_notice(link, today) else: raise ValueError(f'Error: {response.status_code}') except ValueError as ve: print(ve) def run(): parse_home() if __name__=="__main__": run()

Massimo Di Berardino
¡Hola Alex! Validaste que el contenido de las variables title, summary y body esté llegando de manera correcta, puede ser que estas variables no estén tomando los valores y por eso no se escribe nada en el archivo.
Alex Dario Portilla Chungandro
Hola si, yo tambien pense que ese podría ser el causante del porque no se guardan mis archivos, pero al revisar los xpath estos si me regresaban el texto, los verifique usando el .map(x => x.wholeText) para ver si realmente me regresaban el texto y efectivamente estos si me traen el texto que solcite.

Francisco Javier Suarez Verdugo
Buenas tardes Alex, yo tenía el mismo problema. Lo que hice para solucionarlo fue revisar cada uno de los campos de la noticia por medio de un print en el archivo scraper.
try: title = parsed.xpath(XPATH_TITLE)[0] title = title.replace('\"','') print(title) summary = parsed.xpath(XPATH_SUMMARY)[0] print(summary) body = parsed.xpath(XPATH_BODY) print(body)
De esto noté que el title no contenía información, así que lo hice fue ver el código HTML del enlace de la noticia al hacer print de notice:
if response.status_code == 200: notice = response.content.decode('utf-8') print(notice) parsed = html.fromstring(notice)
Revisándolo se observa que el title usa una etiqueta diferente a la que nos muestra el navegador llamada text-fill por lo tanto solo con cambiar en el xpath de title el h2 a text-fill me funciono.
Antes:
XPATH_TITLE = '//div[@class="mb-auto"]/h2/a/text()'
Despues:
XPATH_TITLE = '//div[@class="mb-auto"]/text-fill/a/text()'
Espero que esta información te sirva

Diego Hernández Delgado
Yo tenía el mismo problema... ¡gracias Ulzahk!
Antonio Cerda
Wow muchísimas gracias, llevaba horas revisando mi código, esto me fué muy útil amigo!

Eduard Steven Arias Briceño
Ulzahk, estoy siguiendo el paso a paso de tus respuesta, pero no me aparecen los archivos en la carpeta

Moisés Manuel Morín Hevia
Uff pueden ser muchisimas cosas, has una busqueda binaria para encontar donde falla. Lo más probable sea en el inicio al declarar los XPath

Cesar Hernández Ramírez
wtf moises en estos casos no sirve una busqueda binaria

Cesar Hernández Ramírez
Yo tengo el mismo problema, ya pude extraer todos los campos a la perfección, pero a la hora de crear el archivo dice que no se ha encontrado el archivo {con el titulo de la noticia}, pero se supone que lo tiene que crear, no abrirlo. Sí utilicé el modo escritura.

Cesar Hernández Ramírez
Ya lo solucioné compañeros, el problema no estaba en el título, estaba en mi variable {today}