Uso básico del análisis de datos xpath del rastreador de Python

Descargo de responsabilidad: desde la publicación de este artículo, este artículo es solo para referencia y no se puede reproducir ni copiar. Si la parte que lee este artículo está involucrada en alguna violación de las leyes y regulaciones nacionales, todas las consecuencias correrán a cargo de la parte que lea este artículo y no tenga nada que ver con el bloguero de este artículo. Y debido a la reimpresión, copia y otras operaciones de la parte que lee este artículo, cualquier disputa causada por la violación de las leyes y regulaciones nacionales y todas las consecuencias correrán a cargo de la parte que navega en este artículo y no tienen nada que ver con el bloguero de este artículo.

El análisis de XPath es más común que el análisis de bs4.

import requests
from lxml import etree

1. Gramática básica

1.1 análisis de gramática html

Analizar archivos locales

# 解析本地 html 文件
parser = etree.HTMLParser(encoding="utf-8")
tree = etree.parse("./data/base/taobao.html", parser=parser)

Analizar archivos web

# url, UA
url = "https://www.aqistudy.cn/historydata/"
headers = {
    
    
	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
}
text = requests.get(url=url, headers=headers).text
# 解析
tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))

tree.xpath() Establecer como etiqueta, devolver como Lista.

1.2 Obtener etiquetas

/: Representa un nivel, comenzando desde que se posiciona el nodo raíz
//.: Representando una pluralidad de niveles, el posicionamiento se puede iniciar desde cualquier posición
[n].: El posicionamiento de la primera etiqueta representa el índice desde el 1inicio.

xpath = tree.xpath("/html/body/div")
print(xpath)
print(tree.xpath("/html//div"))
print(tree.xpath("/html/body/div[2]"))

Inserte la descripción de la imagen aquí

1.3 Obtenga el contenido en la etiqueta

Busque una etiqueta de atributo
[@attribute='attributeValue'] : coincidir exactamente, no contener.

# 属性定位
print(tree.xpath("//div[@class='site-nav']"))
# 索引定位: 索引从 1 开始
print(tree.xpath("//div[@class='tb-ie-updater-box']/a[2]"))

Inserte la descripción de la imagen aquí

1.4 Obtenga los atributos en la etiqueta

/text(): Contenido directo, Lista de retorno
//text().: Todo el contenido, Lista de retorno
/@attribute.: Obtener valor de atributo, Lista de retorno.

# 取数据 /text(): 直系内容, 返回 List. //text(): 所有内容, 返回 List.
print(tree.xpath("//div[@class='tb-ie-updater-box']/a[2]/text()"))
print(tree.xpath("//div[@class='tb-ie-updater-box']/a[2]//text()"))
# 取属性值
print(tree.xpath("//div[@class='tb-ie-updater-box']/a/@href"))

Inserte la descripción de la imagen aquí

1.5 Encontrar nodos a través del contenido

Coincidencia aproximada : coincidencia precisa :[contains(text(),"text")]
[text()="text"]

2. Ejemplos

Gatear por la ciudad

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree


if __name__ == '__main__':
    
    # url, UA
    url = "https://www.aqistudy.cn/historydata/"
    headers = {
    
    
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
    }
    text = requests.get(url=url, headers=headers).text
    # 解析
    tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))
    ul = tree.xpath("//div[@class='all']/div[@class='bottom']/ul")
    # 建立文件
    fp = open("./data/city/city_zm.txt", "w", encoding="utf-8")
    # 循环 ul
    for ul_zm in ul:
        zm = ul_zm.xpath("./div[1]/b/text()")[0]
        fp.write(zm + " " + ", ".join(ul_zm.xpath("./div[2]/li/a/text()")) + "\n")
        print(zm + " 添加完成")
    fp.close()

Inserte la descripción de la imagen aquí

Información sobre viviendas de segunda mano

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree
import re


if __name__ == '__main__':

    # url, UA
    url = "https://bj.58.com/ershoufang/"
    headers = {
    
    
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
    }
    # 爬取
    text = requests.get(url=url, headers=headers).text
    # 解析
    tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))
    xpath = tree.xpath("//ul[@class='house-list-wrap']/li")
    # 建立文件
    fp = open("data/esf/ershoufang.txt", "w", encoding="utf-8")
    fp.write("title\tprice\tbase_info\tjjr_info\tpeople_name\n")
    # 循环二手房的 li 标签
    for li_path in xpath:
        # 得到相应的内容
        title = li_path.xpath("./div[@class='list-info']/h2/a/text()")
        price = li_path.xpath("./div[@class='price']/p//text()")
        base_info = li_path.xpath("./div[@class='list-info']/p/span//text()")
        jjr_info = li_path.xpath("./div[@class='list-info']/div/span[1]/text()")
        people_name = li_path.xpath("./div[@class='list-info']/div/a/span/text()")
        replace_base_info = re.sub(" +", " ", re.sub("[\t|\n]", "", " ".join(base_info)))
        replace_jjr_info = re.sub(" +", " ", re.sub("[\t|\n]", "", " ".join(jjr_info)))

        # 写入内容
        fp.write(f"{''.join(title[0].split())}\t{' '.join(price)}\t{replace_base_info}\t{replace_jjr_info}\t{' '.join(people_name)}\n")
        print(f"{''.join(title[0].split())}\t{' '.join(price)}\t{replace_base_info}\t{replace_jjr_info}\t{' '.join(people_name)}")
    fp.close()

Inserte la descripción de la imagen aquí

Fotos de crawl beauty

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree
import os


if __name__ == '__main__':

    for page in range(1, 172):
        # url, UA
        # url = page == 1 ? "http://pic.netbian.com/4kmeinv/" : f"http://pic.netbian.com/4kmeinv/index_{page}.html"
        url = "http://pic.netbian.com/4kmeinv/" if page == 1 else f"http://pic.netbian.com/4kmeinv/index_{page}.html"
        headers = {
    
    
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
        }
        # 爬取
        response = requests.get(url=url, headers=headers)
        # 解决乱码问题
        response.encoding = response.apparent_encoding
        text = response.text
        # 解析
        tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))
        xpath = tree.xpath("//ul[@class='clearfix']/li")
        # 建立文件夹
        if not os.path.exists("./data/mn/%d" % page):
            os.makedirs("./data/mn/%d" % page)
        # 循环美女图片的 li 标签
        for li_path in xpath:
            img_url = "http://pic.netbian.com" + li_path.xpath(".//img/@src")[0]
            # 生成图片
            with open("./data/mn/%d/%s.jpg" % (page, li_path.xpath(".//img/@alt")[0]), "wb") as f:
                f.write(requests.get(url=img_url, headers=headers).content)
        print("%d 页下载完成" % page)

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/YKenan/article/details/111985380
Recomendado
Clasificación