es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Extraer datos de una segunda página incrustada utilizando Python.

Estoy trabajando en un proyecto de web scraping. Mi objetivo es hacer un raspado web del ranking de la Universidad de Shanghai para obtener el nombre, el país y el rango. Actualmente solo me estoy enfocando en el nombre.

import requests

<p>from bs4 import BeautifulSoup</p>

<p>arwu = open('arwu.txt', 'a')
arwu.truncate()
universities = []</p>

<h1>Obtiene la URL desde la cual se debe hacer el raspado web</h1>

<p>url = 'https://www.shanghairanking.com/rankings/arwu/2021.html'
response = requests.get(url)</p>

<h1>Inicializa el analizador HTML de bs4</h1>

<p>soup = BeautifulSoup(response.text, "html.parser")</p>

<h1>Recupera todos los nombres de universidades que se muestran y los formatea</h1>

<p>def find<em>universities():
    for university in range(len(soup.findAll(class</em> ='global-univ'))):
        one<em>a</em>tag = str(soup.findAll(class_ = 'global-univ')[university].text) 
        one<em>a</em>tag=one<em>a</em>tag[len(one<em>a</em>tag)//2+16:]<br>
        universities.append(str(one<em>a</em>tag))
    return universities</p>

<p>universities=find_universities()
for x in range(len(universities)):
  arwu.write(universities[x]+ "\n")
arwu.close()

En este momento, solo recupera las primeras 30 universidades mostradas en la primera página. ¿Cómo puedo acceder a las otras páginas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para acceder a las otras páginas, es necesario modificar la URL cambiando el valor del parámetro “page”. Esto se puede hacer iterando a través de un rango de números y agregándolos a la URL.

    Aquí se presenta un fragmento de código actualizado:

    import requests
    from bs4 import BeautifulSoup
    
    arwu = open('arwu.txt', 'a')
    arwu.truncate()
    universities = []
    
    # loop through multiple pages
    for page in range(1, 5):  # change range as needed
        # Gets the url from which it should web scrape
        url = f"https://www.shanghairanking.com/rankings/arwu/2021?shengyue=Annual&cengci=University&yuanxiao=All&page={page}"
        response = requests.get(url)
    
        # initializes the bs4 html parser
        soup = BeautifulSoup(response.text, "html.parser")
    
        # retrieves all the university names that are displayed and formats them
        def find_universities():
            for university in range(len(soup.findAll(class_='univ-name'))):
                one_a_tag = str(soup.findAll(class_='univ-name')[university].text)
                universities.append(one_a_tag.strip())
            return universities
    
        universities = find_universities()
    
        # write university names to file
        for x in range(len(universities)):
            arwu.write(universities[x]+ "\n")
    
    arwu.close()
    

    En este código actualizado, estamos iterando a través de las páginas 1 a 4 (puede cambiar este rango según sea necesario) y modificando la URL para incluir el número de página. También estamos utilizando un nombre de clase diferente (‘univ-name’) para recuperar los nombres de las universidades, ya que el nombre de clase anterior (‘global-univ’) no devolvía ningún resultado en la página actual.

    Los nombres de las universidades se escriben en el archivo como antes. Puede modificar el código para recuperar otra información, como el país y el rango, encontrando los elementos HTML apropiados y extrayendo el texto deseado.

Comments are closed.