[Rastreador de Java] Jsoup

Sitio web oficial
manual chino

Descarga del sitio web oficial jsoup.jar
jsoup.jar Descarga del disco de red Baidu Código de extracción: g6ek

jsoup es un analizador de HTML de Java, que se utiliza principalmente para analizar HTML y puede analizar directamente una dirección URL y contenido de texto HTML. Proporciona una API que ahorra mucho trabajo, que puede recuperar y manipular datos a través de DOM, CSS y métodos de operación similares a jQuery.

从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;

La clase principal de Jsoup


org.jsoup.Jsoup 类

La clase Jsoup es el punto de entrada de cualquier programa Jsoup y proporcionará métodos para cargar y analizar documentos HTML de varias fuentes. Algunos métodos importantes de la clase Jsoup son los siguientes:
Inserte la descripción de la imagen aquí


org.jsoup.nodes.Document 类 :

Esta clase representa la carga de documentos HTML a través de la biblioteca Jsoup . Puede utilizar esta clase para realizar operaciones que se apliquen a todo el documento HTML. Para conocer los métodos importantes de la clase Document, consulte: http://jsoup.org/apidocs/org/jsoup/nodes/Document.html , los métodos comunes de la clase Document son los siguientes:
Inserte la descripción de la imagen aquí

org.jsoup.nodes.Element 类 :

Los elementos HTML se componen de nombres de etiquetas, atributos y nodos secundarios . Use la clase Element para extraer datos, y los métodos importantes para atravesar nodos y operar la clase HTMLElement se pueden encontrar en: http://jsoup.org/apidocs/org/jsoup/nodes/Element.html , los métodos comunes de la clase Element son los siguientes:
Inserte la descripción de la imagen aquí

Listo para trabajar

Cree un proyecto de Jsoup, la estructura de directorios es la siguiente:
Inserte la descripción de la imagen aquí
para agregar el paquete jar de jsoup, colóquelo en el disco de red de Baidu, la versión es:jsoup-1.11.3

Caso de rastreo de contenido


Rastrear contenido web

Cargue el documento desde la URL, use el Jsoup.connect()método para cargar desde la URL

La información de la página que se rastreará es la siguiente: El
Inserte la descripción de la imagen aquí


código es:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

/**
 * 获取 http://www.ygdy8.net/html/gndy/index.html 页面的“国内电影下载排行“
 */
public class JsoupDemo {
    
    
    public static void main(String[] args) {
    
    
        //URLLoader 是一个静态方法,可以通过类名直接调用
        JsoupDemo.URLLoader("http://www.ygdy8.net/html/gndy/index.html");
    }

    public static void URLLoader(String url){
    
    
        Document d1;

        try {
    
    
            //通过Jsoup类中的静态方法connect返回Document对象,该document对象实际为整个html页面内容。
            d1 = Jsoup.connect(url).get();
            System.out.println("网页的标题是:" + d1.title() + "\n");

            /**
             * 1. 分析网页结构,发现我们想要的国内电影下载排行榜,所对应的class样式为co_content2,
             * 2. 可以通过属性、后代选择器选中元素" div[class=‘co_content2’] ul a" ,然
             * 3. 后通过Element类中的text()方法获取文本内容
             */
            Elements es = d1.select("div[class='co_content2'] ul a");

            //遍历得到的结果并输出内容
            for (Element e : es){
    
    
                System.out.println(e.text());
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

Rastrear el contenido del documento

Cargue el documento desde el archivo, use el Jsoup.parse()método para cargar HTML desde el archivo

La página que se rastreará es la siguiente, que es un documento html en mi ruta local
Inserte la descripción de la imagen aquí

El codigo es:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;

/**
 * 从本地文件加载文档,获取淘宝主营区域包括哪些方面 文件路径为: C:\Users\vsue\Desktop\taobao.html
 */
public class JsoupDocDemo {
    
    
    public static void main(String[] args) {
    
    
        JsoupDocDemo.LocLoader("C:\\Users\\vsue\\Desktop\\taobao.html");
    }

    public static void LocLoader(String address) {
    
    
        Document d2;
        try {
    
    
            //从文件加载文档,使用`Jsoup.parse()`方法从文件加载HTML
            d2 = Jsoup.parse(new File(address), "utf-8");
            System.out.println(d2.title());

            Elements es = d2.select("ul[class='service-bd'] li a");

            for (Element e : es){
    
    
                System.out.println(e.text());
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

    }
}

El resultado es:
Inserte la descripción de la imagen aquí


Rastrear el contenido de String

Cargue el documento desde String, use el método Jsoup.parse () para cargar HTML desde String

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupStrDemo {
    
    
    public static void main(String[] args) {
    
    
        String html = "<html>"
                + "<head>"
                + "<title>First parse</title>"
                + "</head>"
                + "<body>"
                + "<p>Parsed HTML into a doc.</p>"
                + "<a href='http://www.baidu.com'>百度一下</a>"
                + "</body>"
                + "</html>";
        JsoupStrDemo.StringLoader(html);
    }
    public static void StringLoader(String html){
    
    
        //从String加载文档,使用Jsoup.parse()方法从字符串加载HTML
        Document d3 = Jsoup.parse(html);
        String url = d3.select("a").attr("href");
        System.out.println(d3.title()+"    "+url);
    }
}

resultado:
Inserte la descripción de la imagen aquí

Obtener todos los enlaces de la página

Una página a menudo contiene una gran cantidad de URL, salte a diferentes interfaces y luego defina el método para obtener todas las URL de la página principal de Jingdong

Rastrear todas las <a>etiquetas en la página y luego recorrerlas

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

/**
 * 获取HTML页面中的所有链接
 */
public class JsoupAllUrlDemo {
    
    
    public static void main(String[] args) {
    
    
        JsoupAllUrlDemo.allUrlLoader("https://www.jd.com/");
    }
    public static void allUrlLoader(String address){
    
    

        Document d4;
        try {
    
    
            d4 = Jsoup.connect(address).get();

            //links包含了页面所有的连接
            Elements links = d4.select("a[href]");
            for (Element link : links) {
    
    
                System.out.println("text : " + link.text()+"---》link : " + link.attr("href"));
            }
        } catch (IOException e) {
    
    
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Analizar un fragmento de cuerpo

Método
Utilice el método Jsoup.parseBodyFragment (String html).

String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();

El
parseBodyFragmentmétodo de descripción crea un documento vacío e inserta el HTML analizado en el elemento del cuerpo. Si está utilizando el Jsoup.parse(String html)método normal , generalmente puede obtener los mismos resultados, pero el usuario lo ingresa explícitamente como segmento del cuerpo, para asegurarse de que cualquier HTML incorrecto proporcionado por el usuario se resuelva en el elemento del cuerpo.

Document.body()El método puede lograr todos los elementos secundarios en el elemento del cuerpo del documento, y doc.getElementsByTag("body")lo mismo.

Extracción de datos

Método DOM para recorrer el documento

Después de analizar HTML en un documento, puede utilizar métodos similares a DOM para operar. Código de muestra:
Inserte la descripción de la imagen aquí

Explique que el
objeto Elements proporciona una serie de métodos similares a DOM para buscar elementos, extraer y procesar los datos. detalles como sigue:

Encontrar elemento

  • getElementById (ID de cadena)
  • getElementsByTag (etiqueta de cadena)
  • getElementsByClass (String className)
  • getElementsByAttribute (String key) (y métodos relacionados)
  • Elementos hermanos: siblingElements (), firstElementSibling (), lastElementSibling (); nextElementSibling (), previousElementSibling ()
  • Gráfico: padre (), hijos (), hijo (índice int)

Datos del elemento

  • attr (clave de cadena) obtiene atributos attr (clave de cadena, valor de cadena) establece atributos
    atributos () obtiene todos los atributos
  • id (), className () y classNames ()
  • text () Obtener texto de contenido de texto (valor de cadena) Establecer contenido de texto
  • html () Obtiene el HTML en el elemento html (Valor de cadena) Establece el contenido HTML en el elemento
  • externalHtml () Obtiene el contenido HTML fuera del elemento
  • data () Obtener contenido de datos (por ejemplo: script y etiquetas de estilo)
  • tag () y tagName ()

Manipular HTML y texto

  • añadir (String html), anteponer (String html)
  • appendText (texto de cadena), prependText (texto de cadena)
  • appendElement (String tagName), prependElement (String tagName)
  • html (valor de cadena)

Use la sintaxis del selector para buscar elementos

El método
se puede utilizar Element.select(String selector)y los Elements.select(String selector)métodos para encontrar e implementar elementos operativos:

Inserte la descripción de la imagen aquí

El objeto de elementos jsoup admite una sintaxis de selector similar a CSS (o jquery) para lograr una función de búsqueda muy potente y flexible. .

Este método de selección se puede utilizar en objetos Documento , Elemento o Elementos . Y es sensible al contexto, por lo que puede lograr el filtrado de elementos específicos o el acceso a la selección de la cadena.

selectEl método devolverá una Elementscolección y proporcionará un conjunto de métodos para extraer y procesar los resultados.


Descripción general del selector

  • tagname: Busque elementos por etiquetas, como:a
  • ns|tag: Busque elementos en un espacio de nombres a través de la etiqueta, por ejemplo: puede usar la sintaxis fb | name para los <fb:name>elementos
  • #id: Busque elementos por ID, como:#logo
  • .class: Busque elementos por nombre de clase, como:.masthead
  • [attribute]: Use atributos para buscar elementos, como:[href]
  • [^attr]: Utilice el prefijo del nombre de atributo para buscar elementos, por ejemplo: puede utilizarlo [^data-]para buscar elementos con atributos de conjunto de datos HTML5
  • [attr=value]: Utilice valores de atributo para buscar elementos, como:[width=500]
  • [attr^=value], [attr$=value], [attr*=value]: Use valores de atributo coincidentes al principio, al final o que contengan valores de atributo para buscar elementos, como:[href*=/path/]
  • [attr~=regex]: Use valores de atributo para hacer coincidir expresiones regulares para encontrar elementos, como: img[src~=(?i)\.(png|jpe?g)]
  • *: Este símbolo coincidirá con todos los elementos

Uso de combinación de selector selector

  • el#id: Elemento + ID, como: div # logo
  • el.class: Elemento + clase, por ejemplo: div.masthead
  • el[attr]: Elemento + clase, por ejemplo: a [href]
  • 任意组合, Como: a [href] .highlight
  • ancestor child: Busque los elementos secundarios de un elemento, por ejemplo: puede usar .body p para encontrar todos los p elementos debajo del elemento "body"
  • parent > child: Busque los elementos secundarios directos debajo de un elemento principal, por ejemplo: puede usar div.content> p para encontrar el elemento p, o puede usar body> * para encontrar todos los elementos secundarios directos debajo de la etiqueta body
  • siblingA + siblingB: Busque el primer elemento hermano B antes del elemento A, por ejemplo: div.head + div
  • siblingA ~ siblingX: Encuentre el elemento X del mismo nivel antes del elemento A, por ejemplo: h1 ~ p
  • el, el, el: Combinación de selector múltiple, busque el único elemento que coincida con cualquier selector, por ejemplo: div.masthead, div.logo

Pseudo selectorselectors

  • :lt(n): Encuentre el valor del índice hermano del elemento (su posición en el árbol DOM es relativa a su nodo principal) es menor que n, por ejemplo: td: lt (3) significa un elemento de menos de tres columnas
  • :gt(n): Encuentre qué elementos tienen el mismo valor de índice mayor que n, por ejemplo: div p: gt (2) indica qué div contiene más de 2 p elementos
  • :eq(n): Encuentre qué elementos tienen el mismo valor de índice que n, por ejemplo: entrada de formulario: eq (1) significa un elemento de formulario que contiene una etiqueta de entrada
  • :has(seletor): Busca elementos que coincidan con el elemento contenido en el selector, por ejemplo: div: has§ indica qué div contiene el elemento p
  • :not(selector): Busque elementos que no coincidan con el selector, por ejemplo: div: not (.logo) significa una lista de todos los divs que no contienen elementos class = logo
  • :contains(text): Encuentra elementos que contienen el texto dado, la búsqueda no distingue entre mayúsculas y minúsculas, por ejemplo: p: contiene (jsoup)
  • :containsOwn(text): Buscar elementos que contengan directamente el texto dado
  • :matches(regex): Busque qué elementos del texto coinciden con la expresión regular especificada, como: div: coincide con ((? I) inicio de sesión)
  • :matchesOwn(regex): Busca elementos que contienen texto que coincide con la expresión regular especificada

Nota: El índice de pseudo-selector anterior comienza desde 0, lo que significa que el valor de índice del primer elemento es 0, el índice del segundo elemento es 1, etc.
Puede consultar la referencia de la API del selector para obtener más detalles.



Extrae atributos, texto y HTML de elementos

Después de analizar para obtener un objeto de instancia de documento y encontrar algunos elementos, desea obtener los datos en estos elementos.

Método :

  • Para obtener el valor de un atributo, puede usar el Node.attr(String key)método
  • Para el texto de un elemento, puede utilizar el Element.text()método
  • Para llegar al elemento o atributo en el contenido HTML, puede usar Element.html()o Node.outerHtml()método
    Inserte la descripción de la imagen aquí

El método anterior es el método principal de acceso a datos de elementos. Además, se pueden utilizar algunos otros métodos:

  • Element.id()
  • Element.tagName()
  • Element.className()Y Element.hasClass(String className)
    estos métodos de acceso tienen métodos de establecimiento correspondientes para cambiar los datos.


cambiar los datos

problema

在你解析一个Document之后可能想修改其中的某些属性值,
然后再保存到磁盘或都输出到前台页面。

Método
Se puede utilizar el método de configuración de propiedades Element.attr(String key, String value), y Elements.attr(String key, String value).

Si necesita modificar el atributo de clase de un elemento, se pueden utilizar métodos Element.addClass(String className)y Element.removeClass(String className).

Elements proporciona métodos para manipular clases y atributos de elementos en lotes. Por ejemplo, para agregar un rel = "nofollow" a cada elemento en el div, puede utilizar los siguientes métodos:

doc.select("div.comments a").attr("rel", "nofollow");

Explicación
Al igual que otros métodos en Element, el método attr también devuelve el Element (o devuelve la colección Elements cuando se usa el selector) . Esto puede ser muy conveniente para usar el método de escritura. como:

doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");


Establecer el contenido HTML de un elemento

Inserte la descripción de la imagen aquí
Descripción

  • Element.html(String html) Este método primero borrará el contenido HTML en el elemento y luego lo reemplazará con el HTML pasado.
  • Element.prepend(String first)Y un Element.append(String last)método para agregar contenido HTML, respectivamente antes y después de los elementos internos de HTML
  • Element.wrap(String around) Envuelva un contenido HTML externo al elemento.

Establecer el contenido de texto del elemento

Método
Puede utilizar el método de configuración de Element para modificar el contenido del texto en un documento HTML:
Inserte la descripción de la imagen aquí

Nota El
método de configuración de texto es el mismo que el método de establecimiento de HTML:

  • Element.text(String text) Borrará el contenido HTML interno de un elemento y luego reemplazará el texto proporcionado
  • Element.prepend(String first)Y Element.append(String last)los nodos se agregan antes y después del texto dentro del elemento html.

Si el texto entrante contiene caracteres como <,>, etc., se procesará como texto en lugar de HTML.

Supongo que te gusta

Origin blog.csdn.net/weixin_45468845/article/details/108563904
Recomendado
Clasificación