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 beautifulSoup4Dado 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 = "" "
Para hacer una lista desordenada, se usa la etiqueta UL:
Para hacer una lista ordenada, se usa la etiqueta OL:
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 BSOEn 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 ():
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")El código anterior devolvería lo siguiente:
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'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")Esto devolvería los nodos de los niños en una lista:
[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:
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")Esto devuelve lo siguiente:
["\ n aquí hay una lista ordenada \ n",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:
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")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")Esto da el siguiente resultado:
["\ n aquí hay una lista ordenada \ n",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")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")Obtendríamos la lista a continuación:
["\ n aquí hay una lista ordenada \ 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.