Reddit no está devolviendo ningún valor

import requests
from bs4 import BeautifulSoup

respons = requests.get("https://www.reddit.com")

soup = BeautifulSoup(respons.text, "html.parser")

trend_news = soup.select("._3GfG_jvS9X-90Q_8zU4uCu _3Y1KnhioRYkYGb93uAKhBZ")

for news in trend_news:
    link = news.find("a")["href"]
    print(link)

Estoy tratando de conseguir los enlaces de las "noticias clave" en Reddit. Sin embargo, cuando ejecuto este guión no pasa nada, no hay salida.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por algorithmwhiz


3 Respuestas:

  • Hay dos problemas con su código:

    1. Al utilizar su Selector CSS ._3GfG_jvS9X-90Q_8zU4uCu _3Y1KnhioRYkYGb93uAKhBZDebería haber un punto (.En lugar del espacio. Así que sería mejor. ._3GfG_jvS9X-90Q_8zU4uCu._3Y1KnhioRYkYGb93uAKhBZ.

    2. La página se carga dinámicamente, por lo tanto requests El módulo no lo soporta. (No importará incluso si ha fijado su Selector CSS).

    Usted puede obtener los datos para "actuales tendencias" mediante el envío de un GET solicitar a su API https://www.reddit.com/api/trending_searches_v1.json que devolverá los datos en el formato de un diccionario de pitón (dict), que puede acceder al keys / values.

    import requests
    
    
    # Add the user-agent header, otherwise, the page thinks that your a bot and will block you
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }
    response = requests.get(
        "https://www.reddit.com/api/trending_searches_v1.json", headers=headers
    ).json()
    

    >>> # You can access all data like a regular python dictionary
    >>> print(type(response))
    
        
    

    Por ejemplo, para acceder a los títulos:

    ...
    for data in response["trending_searches"]:
        print(data["results"]["data"]["children"][0]["data"]["title"])
    

    Producto (actualmente):

    Buttigieg promises 'infrastructure week' won't be a joke when he's transportation secretary
    HBO Max now on the PlayStation 5
    Mark Hunt vs Paul Gallen | 6-Rounds Boxing | Bankwest Stadium Australia
    What fun in D2 dawning looks like
    Line-ups Mashup for 7pm: Fulham vs Brighton, Liverpool vs Tottenham, West Ham vs Crystal Palace
    [Roscher] Report: Russell Westbrook 'appalled' by Rockets team culture, which revolves around James Harden
    

    O, para acceder a los enlaces:

    for data in response["trending_searches"]:
        print("https://reddit.com" + data["results"]["data"]["children"][0]["data"]["permalink"])
    

    Respondida el Dec 16, 2020 a las 23:58 - por scriptsculptor

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código podría ser que la clase CSS utilizada en el selector de BeautifulSoup no está capturando correctamente los elementos que contienen los enlaces de las noticias clave en la página de Reddit.

    Para solucionar esto, te recomiendo que ajustes el selector CSS para que sea más preciso y pueda capturar correctamente los elementos que contienen los enlaces de las noticias clave. Además, ten en cuenta que algunos sitios web como Reddit pueden cargar el contenido de forma dinámica a través de JavaScript, por lo que es posible que necesites utilizar una herramienta como Selenium para interactuar con la página de manera más completa.

    Aquí te dejo una versión corregida de tu código que utiliza un selector CSS más específico:

    python
    import requests
    from bs4 import BeautifulSoup
    
    respons = requests.get("https://www.reddit.com")
    
    soup = BeautifulSoup(respons.text, "html.parser")
    
    trend_news = soup.select(".Post")
    
    for news in trend_news:
        link = news.find("a", class_="_eYtD2XCVieq6emjKBH3m").get("href")
        print(link)
    

    En este código, he ajustado el selector CSS a .Post, que es la clase que envuelve cada publicación en Reddit. Además, he modificado el selector de BeautifulSoup para capturar el atributo "href" de la etiqueta "a" correctamente.

    Por favor, prueba este código y házmelo saber si tienes algún otro problema.

    Respondida el Dec 18, 2020 a las 00:02 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que la clase CSS que estás usando para buscar los enlaces de las "noticias clave" está incorrecta. La clase correcta es _3buv308G8C7-nJ79o5N84, no _3GfG_jvS9X-90Q_8zU4uCu _3Y1KnhioRYkY93uAKhBZ.

    Aquí tienes el código modificado:

    python
    import requests
    from bs4 import BeautifulSoup
    
    response = requests.get("https://www.reddit.com")
    
    soup = BeautifulSoup(response.text, "html.parser")
    
    trend_news = soup.select("._3buv308G8C7-nJ79o5N84")
    
    for news in trend_news:
        link = news.find("a")["href"]
        print(link)
    

    Este código debería funcionar correctamente y extraer los enlaces de las "noticias clave" de Reddit.

    Respondida el Dec 18, 2020 a las 00:09 - por Gemini

    Votos positivos: 0 | Votos negativos: 0