Crawler (3)--Explicación práctica y detallada de la biblioteca Beautiful Soup 4

01 Prefacio

Después del estudio de los dos primeros artículos, ahora se siente caliente.
Crawler (1) - Lo lleva a comprender los conceptos más básicos de los rastreadores, y puede practicar los
rastreadores en un artículo (2) - Expresiones regulares Si
desea usar bien un rastreador, debe analizar bien el código que encuentre. Beautiful Soup 4, comúnmente conocido como BS4, puede lograrlo fácilmente.

Documentación oficial: https://beautifulsoup.readthedocs.io/zh_CN/latest/

02 Biblioteca BeautifulSoup

2.1 Concepto y resultado general

BeautifulSoup es una biblioteca de Python que puede extraer datos de archivos HTML o XML, un analizador que analiza archivos HTML o XML. Por lo general, se utiliza para analizar la estructura de las páginas web y obtener los documentos web correspondientes.

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,"html.parser")
print(soup.prettify())

soup.prettify()Formatee la salida del contenido de la sopa, cuando use BeautifulSoup para analizar el documento HTML, tratará DOM文档树el documento HTML de manera similar.

Nota: Se supone que el par de etiquetas del código fuente HTML carece de la etiqueta final, es decir, no hay una etiqueta y, pero prettify()el resultado de usar la salida de la función puede seretiqueta final de autocompletar, que es una de las ventajas de BeautifulSoup: incluso si BeautifulSoup obtiene una etiqueta dañada, generará un árbol DOM convertido, que es lo más consistente posible con el contenido de su documento original. Esta medida generalmente lo ayuda a recopilar datos de manera más correcta.

2.2 objeto BeautifulSoup

El documento oficial de BeautifulSoup resume todos los objetos en los siguientes cuatro tipos:

  • Tag: incluyendo Nombre y Atributos,
#Name
print(tag.name)   # 输出标签名
print(tag.string)  # 输出标签的内容

#Attributes
print(tag.attrs) # 以键值对的方式输出标签的class和id
print(tag['class'])  # 得到class的值

Obtenga el contenido de la etiqueta inicial:

from bs4 import BeautifulSoup

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

# 获取HTML的标题,包括自身标签全部输出
head = soup.head
print('头部:', head)

# 头部: <head><title>BeautifulSoup技术</title></head>

Tenga en cuenta que este método directo .head solo puede obtener la primera etiqueta correspondiente. Si desea obtener todo el contenido de la etiqueta, aún necesita finid_all()las funciones que aprendió más adelante.

  • NavigableString
    Ejemplo: sopa.a['clase'].string, obtenerel primero atravesado, una etiqueta de hipervínculo con clase clasecontenido
  • BeautifulSoup
    El objeto BeautifulSoup representa todo el contenido de un documento.
print(type(soup))
# <class 'BeautifulSoup.BeautifulSoup'>
  • Comment
    El objeto Comentario es un tipo especial de objeto NavigableString que se usa para manejar objetos de comentario.

Ejemplo:

markup = "<b><!-- This is a comment code. --></b>"  
soup = BeautifulSoup(markup, "html.parser")
comment = soup.b.string 
print(comment) 

2.3 Cómo obtener el contenido dentro de la etiqueta html

1. Conozca la ubicación específica de la información que desea obtener y solo obtenga un contenido

soup = BeautifulSoup(html)
# 方法一:获得第二个a标签下的内容,已知标签所在位置
print(soup.select('a')[1].string)
# 方法二,已知标签所在位置
print(soup.find('a').contents[1])

2. La información de ubicación es desconocida y solo se obtiene un contenido

# 或者,未知标签所在位置,只知道你要找的class,再利用正则表达式提取文字
dufu_text = soup.find('a', {
    
    'class': 'poet1'}).text
dufu_two_chars = re.search(r'(\S\S)', dufu_text).group(1)

print(dufu_two_chars) # 输出:杜甫的两个字“杜甫”

# 或者
dufu_text = soup.find('a', class_ = 'poet1')
print(dufu_text.text)

3. Información de ubicación desconocida, obtenga todo el contenido

# 位置标签所在位置,使用find_all方法,必须使用列表遍历的方式输出
dufu_text = soup.find_all('a', class_ = 'poet1')

for dufu in dufu_text:
    print(dufu.text)

4. Quiere obtener la URL debajo de la etiqueta de hipervínculo

links = soup.find_all('a',class_ = 'poet1')

# 按照列表的形式取出
for link in links:
    print(link.get('href'))

# 或者如下
for index, link in enumerate(links1):
    href = link['href']
    print(f"Index: {
      
      index}, Href: {
      
      href}")

2.4 Explicación detallada de la declaración más conveniente find_all()

  find_all()función es una función en la biblioteca BeautifulSoup para encontrar todos los elementos en el documento que cumplen con los criterios . Puede aceptar múltiples parámetros especificando atributos específicos y valores de atributo del elemento a buscar. La siguiente es una explicación detallada de los parámetros de la función find_all():

  • nameParámetros: especifique qué buscarNombre de etiqueta o lista de etiquetas. Puede ser una cadena o un objeto de expresión regular. Si no se especifica este parámetro, se devuelven todas las etiquetas del documento.

Expresión regular: find_all(re.compile("expresión regular"))

  • attrsParámetros: especifique qué buscarAtributos de elementos y valores de atributos. Puede ser un tipo de diccionario o argumentos de palabras clave. La clave del tipo de diccionario es el nombre del atributo y el valor es el valor del atributo. Si se usan argumentos de palabra clave para pasar atributos y valores de atributo, el nombre del atributo se usa como palabra clave y el valor del atributo se usa como valor.

dufu_text = sopa.find_all('a', atributos = {'clase': 'poeta1'})

  • Parámetro recursivo: Especifica si buscar recursivamente en los nodos descendientes del documento. El valor predeterminado es True, lo que significa búsqueda recursiva. Si se establece en False, solo se buscan elementos secundarios inmediatos del documento.

  • stringParámetros: especificar el elemento a buscarcontenido del texto. Puede ser una cadena o un objeto de expresión regular. Si se especifica, solo se devuelven los elementos que contienen el texto especificado.

sopa.find_all(cadena=[“Tillie”, “Elsie”, “Lacie”])

  • parámetro de límite: especifica el límite en el número de resultados devueltos. El valor predeterminado es Ninguno, lo que significa devolver todos los resultados. Si se establece un límite, devuelve hasta el número especificado de resultados.

  • **parámetro kwargs: se usa para pasar otros parámetros, comoSelector de CSSetc, por ejemplo:

sopa.find_all(“un”, clase_=“poeta”,id='enlace1')

2.5 Recorriendo el árbol del documento

Consulte los siguientes documentos:
1. https://blog.csdn.net/Eastmount/article/details/109497225

2, https://blog.csdn.net/qq_42554007/article/details/90675142?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168005957816800186557025%2522%252C%252 2scm %2522%253A%252220140713.130102334.pc%255Otoño .%2522%257D&request_id=168005957816800186557025&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2 todo first_rank_ecpm_v1 ~hot_rank-5-90675142-null-null.142 v76 insert_down38,20 1 v4 add_ask,239 v2 insert_chatgpt&utm_term=beautifulsoup&spm=1018.2226. 3001.4187

3、https://blog.csdn.net/xuebiaojun/article/details/119654841?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168009930316800192237083%2522%252C%2522scm%2 522%253A%252220140713.130102334…%2522% 257D&request_id=168009930316800192237083&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2 all top_click~default-1-119654841-null-null.142 v77 insert_down38,201 v4 add_ask,239 v 2 insert_chatgpt&utm_term=sopa.find_all%E7%94% A8%E6%B3%95&spm=1018.2226.3001.4187

  • Obtener el primer nodo secundario: childreno contents,

Cuando se usa realmente, find_all se usa generalmente en lugar de estos nodos, estos nodos son para aclarar la estructura.

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,"html.parser")
print(soup.head.contents)  # 输出hrad标签下的第一个子标签
for contents in soup.head.contents:
    print(contents)
  • Si necesita obtener el contenido de varios nodos, use stringsatributos:
for content in soup.head.strings:
    print(content)
  • La cadena de salida puede contener espacios adicionales o saltos de línea, aquí debe usar stripped_stringsun método para eliminar los espacios adicionales, el código es el siguiente:
for content in soup.stripped_strings:
    print(content)

Para otros nodos del árbol de documentos, buscar en el árbol de documentos es similar a atravesar el árbol de documentos, incluidos los nodos principales, los nodos secundarios, los nodos hermanos, etc. Se recomienda obtener información del sitio web oficial. generalmente usadofind_all

03 lista de materiales y DOM

Para aprender a usar BS4 bien, es necesario comprender BOM y DOM. Originalmente quería escribirlos juntos, pero luego descubrí que podría necesitar estudiarlos por separado. Este artículo termina aquí por el momento. El siguiente artículo actualizaré BOM y DOM, y continuaré enseñándote cómo escribir rastreadores. ~

Supongo que te gusta

Origin blog.csdn.net/qq_54015136/article/details/129843517
Recomendado
Clasificación