Crawler (2)--expresiones regulares

01 Prefacio

El artículo anterior ha presentado en detalle qué es un rastreador, algunos conceptos básicos que un rastreador debe dominar y la primera biblioteca que ha dominado un rastreador. Para obtener más detalles, puede hacer clic aquí: requestsCrawler (1): lo llevará a comprender el concepto más básico de los rastreadores, se puede practicar un artículo

A continuación, detallaré otra herramienta muy necesaria para los rastreadores, las expresiones regulares.

Este artículo hace referencia al siguiente enlace:
https://blog.csdn.net/xuemoyao/article/details/8033138?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168006967216800215067670%2522%252C%2 522scm %2522% 253A% 252220140713.130102334…%2522%257D&request_id=168006967216800215067670&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2 todos top_positive~ predeterminado -2-803 3138- null-null.142 v77 insert_down38, 201 v4 add_ask , 239 v2 insert_chatgpt & utm_term = %E6% AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F&spm=1018.2226.3001.4187

02 expresiones regulares

  Definición: las expresiones regulares son herramientas poderosas para procesar cadenas y generalmente se usan para recuperar y reemplazar texto que cumple con ciertas reglas.

rebiblioteca 2.1

Python proporciona soporte para expresiones regulares a través de la biblioteca re, pero antes de usar expresiones regulares, debe importar el módulo re para llamar a la función del módulo.

Varios parámetros comunes de re

  • re.I: hacer que la coincidencia ignore el caso
  • re.M: Permitir la coincidencia de varias líneas
  • re.S: coincide con todos los caracteres, incluidas las líneas nuevas

En Python, el uso de expresiones regulares generalmente requiere el uso del módulo re. Varios métodos comúnmente utilizados incluyen:

  • re.search(pattern, string): cadenas de búsqueda que coincidan con la expresión regularprimera subcadenay devuelve un objeto Match que contiene información coincidente. Devuelve Ninguno si no se encuentra ninguna coincidencia.

  • re.findall(pattern, string): cadenas de búsqueda que coincidan con la expresión regulartodas las subcadenasy lo devuelve como una lista. Si no se encuentra ninguna coincidencia, se devuelve una lista vacía.

  • re.sub(pattern, repl, string): busca en una cadena todas las subcadenas que coincidan con la expresión regular y las reemplaza con la cadena especificada repl. devolverla cadena reemplazada

El siguiente es un ejemplo de salida de código por línea:

import re

# 定义要匹配的正则表达式
pattern = r'^\d+\..*'

# 打开文件
with open('example.txt', 'r') as f:
    # 按行读取文件内容
    for line in f:
        # 使用re.match()函数进行匹配
        match_obj = re.match(pattern, line)
        # 如果匹配成功,则输出该行内容
        if match_obj:
            print(line.strip())

En el código anterior, primero se define la expresión regular que debe coincidir, que puede coincidir con líneas que comienzan con un número seguido de cualquier carácter. Luego abra el archivo, lea el contenido del archivo línea por línea y use la función re.match() para hacer coincidir el contenido de cada línea. Si la coincidencia es exitosa, muestra el contenido de la línea.

Tenga en cuenta que strip()la función puede eliminar espacios y saltos de línea en ambos extremos de la cadena.

2.2 Parámetros de expresiones regulares

Dos parámetros de uso común:
en las expresiones regulares, . y ? son metacaracteres con significados especiales.

  • .Representa una coincidenciaarbitrariamenteUn solo carácter (excepto nueva línea).

Por ejemplo, la expresión regular ab puede coincidir con axb, a#b, ab, etc.

  • ?Representa coincidir con el anteriorsubexpresión0 o 1 vez.

Por ejemplo, la expresión regular ab?c coincide con ac y abc, pero no con abbc.

? también se puede usar después de otros metacaracteres para indicaremparejamiento no codicioso. Por ejemplo, la expresión regular a.*?b puede coincidir con ab, axxxb, etc., pero al coincidir con axxxbyyyb, solo coincidirá con axxxb.

  Debe tenerse en cuenta que . y ? tienen el significado especial mencionado anteriormente solo cuando se usan como metacaracteres en expresiones regulares. Si necesitan coincidir entre sí, deben usar el carácter de escape \. Por ejemplo, la expresión regular ab puede coincidir con ab, pero no con axb, a#b, etc.

2.2.1 Metacaracteres de uso común

el código ilustrar
. coincide con cualquier carácter excepto nueva línea
\w Hacer coincidir letras, números, guiones bajos o caracteres chinos
\s coincide con cualquier espacio en blanco
\d números de coincidencia
\b coincide con el principio o el final de una palabra
^ coincide con el comienzo de la cadena
ps coincide con el final de la cadena

Ejemplo:

  • ^\d{8}$ coincide con el número qq con 8 dígitos.

  • \bOlive\b coincide con la palabra Olive.

Nota: I Love Oliver and Olive. En este momento, se devuelve Oliver en lugar de Oliver, porque \b...\b devuelve palabras coincidentes

2.2.2 Antónimos

Caracteres antónimos: se utiliza principalmente para encontrar cualquier carácter, excepto un carácter determinado.

código/sintaxis ilustrar
\W Coincide con cualquier carácter que no sea una letra, un número, un guión bajo o un carácter chino
\S coincide con cualquier carácter que no sea un espacio en blanco
\D coincide con cualquier carácter no numérico
\B coincide con una posición que no es el principio o el final de una palabra
[^x] coincide con cualquier caracter excepto x
[^datos] Coincide con cualquier carácter excepto datos

2.2.3 Caracteres delimitados

Caracteres delimitados: los caracteres delimitados se utilizan principalmente para tiempos de coincidencia repetidos.

código/sintaxis ilustrar
* Repetir cero o más veces
+ repetir una o más veces
? subcadena repetida cero o una vez
{norte} repetir n veces
{norte,} repetir n o más veces
{Nuevo Méjico} Repetir de n a m veces

2.2.4 Caracteres de escape

Carácter de escape: añadir \.

Ejemplo: como metacaracteres. * \ debe convertirse a \. \* \\

Bifurcación de caracteres: se usa principalmente para cumplir con la selección de diferentes situaciones. Use "|" para separar diferentes condiciones. Por ejemplo, algunos códigos de área de línea fija tienen tres dígitos y algunos tienen cuatro dígitos. En este momento, se puede usar la bifurcación de caracteres

Por ejemplo: \d{3}-\d{8}|\d{4}-\d{8} puede hacer coincidir líneas fijas con códigos de área de dos longitudes diferentes

2.2.5 Agrupación de caracteres

La agrupación de caracteres se utiliza principalmente para repetir varios caracteres, principalmente mediante el uso de paréntesis () para agrupar

La forma es como: (\d\w){3} Combina repetidamente 3 veces (\d\w)

Sintaxis de agrupación común:

Clasificación el código ilustrar
captura (Exp) coincide con exp y captura texto en grupos con nombres automáticos
(?< nombre >exp) Haga coincidir exp y capture el texto en un grupo llamado nombre, que también se puede escribir como (?'name'exp)
(?:Exp) Hacer coincidir exp, no capturar el texto coincidente y no asignar un número de grupo a este grupo
afirmación de ancho cero (?=exp) Coincidir con la posición delante de exp
(?<=exp) Coincidir con la posición después de exp
(?!Exp) Coincide con una posición que no va seguida de exp
(?<!exp) Coincide con una posición que no está precedida por exp
nota (?#comentario) Este tipo de agrupación no tiene ningún efecto en el procesamiento de expresiones regulares y se utiliza para proporcionar comentarios para que la gente los lea.

2.2.6 Emparejamiento perezoso y codicioso

Coincidencia codiciosa : cuando la expresión regular contiene calificadores repetidos, el comportamiento habitual esemparejar tantos como sea posiblecarácter de.

Coincidencia diferida : a veces es necesario hacer coincidir la menor cantidad de caracteres posible.

Por ejemplo: a.*b, coincidirá con la cadena más larga que comienza con a y termina con b. Si lo usa para buscar aabab, coincidirá con toda la cadena aabab. Pero lo que quizás necesitemos hacer coincidir en este momento es ab, por lo que debemos usar la coincidencia diferida. La coincidencia perezosa coincide con la menor cantidad de caracteres posible.

código/sintaxis ilustrar
*? Repita cualquier número de veces, pero la menor cantidad de veces posible
+? Repita 1 o más veces, pero la menor cantidad de veces posible
?? Repita 0 o 1 veces, pero la menor cantidad de veces posible
{Nuevo Méjico}? Repita n a m veces, pero la menor cantidad de veces posible
{norte,}? Repita n veces más, pero la menor cantidad posible

2.2.7 Referencias anteriores

Las referencias inversas se utilizan para buscar repetidamente texto que coincida con una agrupación anterior.

Después de especificar una subexpresión entre paréntesis, el texto que coincide con la subexpresión (es decir, el contenido capturado por este grupo) puede procesarse más en la expresión o en otros programas. De forma predeterminada, cada grupo tiene automáticamente un número de grupo.

  • Número de grupo predeterminado:
    Ejemplo: \b(\w+)\b\s+\1\b se puede usar para hacer coincidir palabras repetidas, como go go o kitty kitty.

Esta expresión es primero una palabra, es decir, más de una letra o número (\b(\w+)\b) entre el principio y el final de la palabra, esta palabra será capturada en el grupo numerado 1, luego uno o más caracteres en blanco (\s+), y finalmente el contenido capturado en el grupo 1 (es decir, la palabra que coincidió anteriormente) (\1).

  • Autoespecificado: también puede especificar el nombre de grupo de la subexpresión usted mismo.
    Para especificar el nombre del grupo de una subexpresión, use esta sintaxis: (?<Palabra>\w+) (o reemplace los corchetes angulares con ': (?'Palabra'\w+)), así que ponga\w+ El nombre del grupo se especifica como Palabra. desearPara retroreferenciar lo que captura este grupo, puede usar \k<Palabra>,所以上一个例子也可以写成这样:\b(?< Word>\w+)\b\s+\k< Word>\b

2.2.8 零宽断言

有时候需要查找某些匹配之前或之后的东西,这个时候就需要指定一个位置,这个位置应该满足一定的条件(即断言)。具体请看 本章的2.2.5

比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。
比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

2.3 常用的正则表达式

  • 如果你自己实在学不会正则表达式,请点击这里,转载自其他大神:点击这里,他里面归纳了基本所有你想要的用的正则表达式。
  • 如果里面没有你想要的,请私信我。

2.4 正则表达式的实例

(1) 抓取html里面的<title>间的内容

#方法一
title = re.findall(r'<title>(.*?)</title>', content.decode('utf-8'))

# 方法二
pat = r'(?<=<title>).*?(?=</title>)'    
ex = re.compile(pat, re.M|re.S)
obj = re.search(ex, content.decode('utf-8'))
title = obj.group()  
print(title)

(2)爬取超链接<a>标签间的内容

#获取完整超链接
res = r"<a.*?href=.*?<\/a>"
urls = re.findall(res, content.decode('utf-8'))

#获取超链接<a>和</a>之间内容
res = r'<a .*?>(.*?)</a>'  
texts = re.findall(res, content.decode('utf-8'), re.S|re.M)  

(3)抓取超链接标签的url

res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"
urls = re.findall(res, content, re.I|re.S|re.M)
for url in urls:
    print(url)

(4)抓取图片超链接标签的url

content = '''<img alt="Python" src="http://www.yangxiuzhang.com/eastmount.jpg" />'''
urls = re.findall('src="(.*?)"', content, re.I|re.S|re.M)
print urls

(5)获取url中最后一个参数
  在使用Python爬取图片过程中,通常会遇到图片对应的url最后一个字段用来命名图片的情况,如“photo1.jpg”,需要通过解析url“/”后面的参数来获取图片。

urls = 'http://www..csdn.net/photo1.jpg'
name = urls.split('/')[-1]  
print name

补充:如果取得的text有其他字符,可以进行数据的预处理

使用.replace()方法,将需要替换的特殊字符统统替换成空字符,可以看数据分析这一讲,详细学习该方法的用法。

03 还在学习(ing)

想要学好爬虫,还需要学习以下基础知识:

  • Beautiful Soup 4
  • XPATH技术:分析网页的DOM树结构,通过XPATH技术定位网页所爬取内容的节点,再抓取数据
  • Scrapy框架
  • Selenium库

Supongo que te gusta

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