Encontrar nodos para niños con hermosa sopa

Encontrar nodos para niños con hermosa sopa
La tarea del raspado web es aquella que requiere la comprensión de cómo están estructuradas las páginas web. Para obtener la información necesaria de las páginas web, uno debe comprender la estructura de las páginas web, analizar las etiquetas que contienen la información necesaria y luego los atributos de esas etiquetas.

Para los principiantes en el raspado web con BeautifulSoup, se puede encontrar un artículo que discute los conceptos de raspado web con esta poderosa biblioteca.

Este artículo es para programadores, analistas de datos, científicos o ingenieros que ya tienen el conjunto de habilidades de extraer contenido de las páginas web utilizando BeautifulSoup. Si no tiene ningún conocimiento de esta biblioteca, le aconsejo que pase por el tutorial de BeautifulSoup para principiantes.

Ahora podemos continuar, quiero creer que ya tiene esta biblioteca instalada. Si no, puede hacer esto usando el siguiente comando:

PIP install beautifulSoup4

Dado que estamos trabajando con la extracción de datos de HTML, necesitamos tener una página básica de HTML para practicar estos conceptos en. Para este artículo, usaríamos este fragmento HTML para la práctica. Voy a asignar el siguiente fragmento HTML a una variable usando las citas triple en Python.

sample_content = "" "

Linuxhint



Para hacer una lista desordenada, se usa la etiqueta UL:


    Aquí hay una lista desordenada
  • Primera opción

  • Segunda opción




Para hacer una lista ordenada, se usa la etiqueta OL:


    Aquí hay una lista ordenada
  1. Número uno

  2. Número dos



Pista de Linux, 2018



"" "

Ahora que lo hemos ordenado, avancemos directamente a trabajar con la biblioteca de BeautifulSoup.

Vamos a hacer uso de un par de métodos y atributos que llamaríamos a nuestro objeto BeautifulSoup. Sin embargo, tendríamos que analizar nuestra cadena usando BeautifulSoup y luego asignar a una variable "Our_Soup".

de bs4 import beautifulsoup como BSO
our_soup = bso (sample_content, "lxml")

En adelante, estaríamos trabajando con la variable "our_soup" y llamando a todos nuestros atributos o métodos en ella.

En una nota rápida, si aún no sabe qué es un nodo infantil, es básicamente un nodo (etiqueta) que existe dentro de otro nodo. En nuestro fragmento HTML, por ejemplo, las etiquetas LI son nodos infantiles de las etiquetas "UL" y "OL".

Aquí están los métodos que analizaríamos:

  • Findchild
  • Findigherren
  • contenido
  • niños
  • descendientes

findchild ():

El Findchild El método se utiliza para encontrar el primer nodo infantil de los elementos HTML. Por ejemplo, cuando echamos un vistazo a nuestras etiquetas "OL" o "UL", encontraríamos dos etiquetas de niños en él. Sin embargo, cuando usamos el Findchild método, solo devuelve el primer nodo como el nodo infantil.

Este método podría resultar muy útil cuando queremos obtener solo el primer nodo infantil de un elemento HTML, ya que devuelve el resultado requerido de inmediato.

El objeto devuelto es del tipo BS4.elemento.Etiqueta. Podemos extraer el texto de él llamando al atributo de texto en él.

Aquí hay un ejemplo:

First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
Imprimir (First_Child.findchild ())

El código anterior devolvería lo siguiente:

  • Número uno
  • Para obtener el texto de la etiqueta, llamamos al texto atributo en él.

    Como:

    Imprimir (First_Child.findchild ().texto)

    Para obtener el siguiente resultado:

    'Número uno'
    FindChildren ():

    Hemos echado un vistazo al Findchild método y visto cómo funciona. El Findigherren El método funciona de manera similar, sin embargo, como su nombre lo indica, no encuentra solo un nodo infantil, obtiene todos los nodos de los niños en una etiqueta.

    Cuando necesite obtener todos los nodos de los niños en una etiqueta, el Findigherren El método es el camino a seguir. Este método devuelve todos los nodos para niños en una lista, puede acceder a la etiqueta de su elección utilizando su número de índice.

    Aquí hay un ejemplo:

    First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
    Imprimir (First_Child.findChildren ())

    Esto devolvería los nodos de los niños en una lista:

    [
  • Número uno
  • ,
  • Número dos
  • ]

    Para obtener el segundo nodo secundario en la lista, el siguiente código haría el trabajo:

    Imprimir (First_Child.findChildren () [1])

    Para obtener el siguiente resultado:

  • Número dos
  • Eso es todo Beautifulsoup proporciona cuando se trata de métodos. Sin embargo, no termina ahí. Los atributos también se pueden llamar a nuestros objetos de beautifulsoup para que el nodo de niño/hijos/descendientes de un elemento HTML.

    contenido:

    Mientras que la Findigherren El método hizo el trabajo directo de extraer los nodos de los niños, el contenido Los atributos hacen algo un poco diferente.

    El contenido El atributo devuelve una lista de todo el contenido en un elemento HTML, incluidos los nodos infantiles. Entonces cuando llamas al contenido Atributo en un objeto BeautifulSoup, devolvería el texto como cadenas y los nodos en las etiquetas como un BS4.elemento.Etiqueta objeto.

    Aquí hay un ejemplo:

    First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
    Imprimir (First_Child.contenido)

    Esto devuelve lo siguiente:

    ["\ n aquí hay una lista ordenada \ n",
  • Número uno
  • ,
    '\norte',
  • Número dos
  • , '\norte']

    Como puede ver, la lista contiene el texto que viene ante un nodo infantil, el nodo secundario y el texto que viene después del nodo infantil.

    Para acceder al segundo nodo infantil, todo lo que necesitamos hacer es utilizar su número de índice como se muestra a continuación:

    Imprimir (First_Child.contenido [3])

    Esto devolvería lo siguiente:

  • Número dos
  • niños:

    Aquí hay un atributo que hace casi lo mismo que el atributo de contenido. Sin embargo, tiene una pequeña diferencia que podría tener un gran impacto (para aquellos que toman en serio la optimización del código).

    El atributo de niños también devuelve el texto que viene antes que un nodo infantil, el nodo infantil en sí y el texto que viene después del nodo infantil. La diferencia aquí es que los devuelve como generador en lugar de una lista.

    Echemos un vistazo al siguiente ejemplo:

    First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
    Imprimir (First_Child.niños)

    El código anterior proporciona los siguientes resultados (la dirección en su máquina no tiene que contar con la siguiente):

    Como puede ver, solo devuelve la dirección del generador. Podríamos convertir este generador en una lista.

    Podemos ver esto en el siguiente ejemplo:

    First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
    Imprimir (Lista (First_Child.niños))

    Esto da el siguiente resultado:

    ["\ n aquí hay una lista ordenada \ n",
  • Número uno
  • ,
    '\norte',
  • Número dos
  • , '\norte']

    descendientes:

    Mientras que la niños El atributo funciona para obtener solo el contenido dentro de una etiqueta i.mi. el texto y los nodos en el primer nivel, el descendientes El atributo va más profundo y hace más.

    El descendientes El atributo obtiene todo el texto y los nodos que existen en los nodos infantiles. Entonces no devuelve solo los nodos para niños, también devuelve los nodos de los nietos.

    Asides que devuelven el texto y las etiquetas, también devuelve el contenido en las etiquetas como cadenas también.

    Al igual que el niños atributo, descendientes Devuelve sus resultados como generador.

    Podemos ver esto a continuación:

    First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
    Imprimir (First_Child.descendientes)

    Esto da el siguiente resultado:

    Como se vio anteriormente, podemos convertir este objeto generador en una lista:

    First_child = our_soup.encontrar ("cuerpo").encontrar ("ol")
    Imprimir (Lista (First_Child.descendientes))

    Obtendríamos la lista a continuación:

    ["\ n aquí hay una lista ordenada \ n",
  • Número uno
  • ,
    'Número uno', '\ n',
  • Número dos
  • , 'Número dos', '\ n']

    Conclusión

    Ahí lo tienes, cinco formas diferentes de acceder a los nodos infantiles en elementos HTML. Podría haber más formas, sin embargo, con los métodos y atributos discutidos en este artículo, uno debería poder acceder al nodo infantil de cualquier elemento HTML.