爬虫实战:页面解析详细指南(正则表达式、XPath、jsoup、Gson)

Python爬虫解析网页的3种方式,值得收藏 一般来说当我们爬取网页的整个源代码后,是需要对网页进行解析的。 Python网页解析正则匹配解析:BeautifulSoup解析项目实战 正常的解析方法有三种 ①:正则匹配解析 ②:BeatuifulSoup解析 ③:lxml解析 正则匹配解析: 在之前的学习中,我们学习过爬虫的基本用法,比如/s,/d,/w,*,+,?等用法,但是在对爬取到的网页进行解析的时候,仅仅会这些基础的用法,是不够用的,因此我们需要了解Python中正则匹配的经典函数。 re.match runoob解释:re.match尝试从字 阅读详情

爬虫的第二步,是对源码进行解析,提炼出目标内容。


一、正则表达式

正则表达式(Regular Expression),计算机科学的一个概念。通常被用来检索、替换那些符合某个规则的文本。

在爬虫程序中,随处可见正则表达式的影子。无论是 URL 筛选过滤,还是正文内容解析,都离不开正则表达式的支持。可以这么说,如果没有正则表达式,那么开发者将很难编写一个完整的爬虫程序。

如果之前没有接触过正则表达式,可以通过以下教程快速入门:

Java 与正则表达式相关的类主要在 java.util.regex 包中。在 Java 中使用正则表达式,首先就要掌握 regex 包中的 Pattern 类与 Matcher 类。二者的作用如下表所示:

class nameintroduction
Pattern表示一个已经编译好的正则表达式
Matcher通过 Pattern 实例对任意字符序列进行匹配的引擎

使用 Pattern 与 Matcher 实现正则匹配,需要以下步骤:

  • 通过 Pattern.compile(String regex) 创建一个不可变的、线程安全的 Pattern 实例;
  • 通过 Pattern.matcher(CharSequence input) 获得 Matcher 类实例;
  • 使用 Matcher 类的 find() 方法对任意字符序列进行匹配(matches() 和 lookingAt() 方法也可以实现匹配功能);
  • 通过 Matcher 类的 group(int group) 返回匹配到的子字符串。

下面,我们尝试使用正则表达式从以下 HTML 文本中解析出节点 P 中的文本信息。

<html>
    <body>
        <p>今天的日期是:2017-11-11</p>
    </body>
</html>
package demo;

import util.FileUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式 demo
 *
 * @author panda
 * @date 2017/11/12
 */
public class RegexDemo {

    private static Pattern DATE_PATTERN = Pattern.compile("<p>(.*?)</p>");

    public static void main(String[] args) {
        String htmlBody = FileUtils.readFile("test.html", "UTF-8");
        System.out.println(htmlBody);

        Matcher matcher = DATE_PATTERN.matcher(htmlBody);

        if (matcher.find()) {
            String[] s = new String[matcher.groupCount() + 1];
            for (int i = 0; i <= matcher.groupCount(); i++) {
                s[i] = matcher.group(i);
            }
            System.out.println(s[1]);
        }
    }

}

运行主函数后,控制台输出如下信息:

<html>    <body>        <p>今天的日期是:2017-11-11</p>    </body></html>
今天的日期是:2017-11-11

二、XPath

XPath 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。它可以通过路径表达式在树状数据结构中选取指定节点或节点集。

由于 HTML 和 XML 一样拥有树状数据结构,因此 XPath 同样适用 HTML 文档。

在 Java 中使用 XPath,需要引入以下 jar 包:

  • xalan.jar
  • nekohtml.jar
  • xml-apis.jar

通过 XPath 实现 HTML 文档解析,一般需要以下步骤:

  • 通过 nekehtml.jar 中 DOMParser 类的 parse(InputSource var1) 方法获取一个 Document 实例;
  • 通过 xalan.jar 中的 XPathAPI,实现节点或节点集的选取;
  • 通过 Node 接口提取节点属性与节点信息。

下面,我们尝试使用 XPath 来解析出上述 HTML 文档中 P 节点的文本信息。

package demo;

import org.apache.xpath.XPathAPI;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import util.FileUtils;

import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;

/**
 * XPath demo
 *
 * @author panda
 * @date 2017/11/18
 */
public class XPathDemo {

    public static void main(String[] args) {
        String htmlBody = FileUtils.readFile("test.html", "UTF-8");
        System.out.println(htmlBody);

        try {
            DOMParser parser = new DOMParser();
            parser.setFeature("http://xml.org/sax/features/namespaces", false);
            parser.setProperty(
                    "http://cyberneko.org/html/properties/default-encoding",
                    "UTF-8");

            ByteArrayInputStream in = new ByteArrayInputStream(htmlBody.getBytes());
            InputStreamReader reader = new InputStreamReader(in);
            InputSource source = new InputSource(reader);
            parser.parse(source);

            Document doc = parser.getDocument();
            Node node = XPathAPI.selectSingleNode(doc, ".//P");
            System.out.println(node.getTextContent());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

运行主函数后,我们可以在控制台看到同样的结果。


三、jsoup

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常强大的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

实际上,jsoup 与 XPath 非常相似。

在 Java 中使用 jsoup,同样需要我们引入 jar 包:

  • jsoup-1.10.2.jar

通过 jsoup 解析 HTML 文档,需要以下步骤:

  • 通过 Jsoup.parse(String html) 获取一个 Document 实例(注意,不是 w3c 下的 Document);
  • 通过 Document 获取 Element 对象或 Elements 集合;
  • 通过 Element 获取节点属性和节点信息。

下面,我们尝试使用 jsoup 完成相同的解析需求。

package demo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import util.FileUtils;

/**
 * jsoup demo
 *
 * @author panda
 * @date 2017/11/12
 */
public class JsoupDemo {

    public static void main(String[] args) {
        String htmlBody = FileUtils.readFile("test.html", "UTF-8");
        System.out.println(htmlBody);

        Document doc;
        try {
            doc = Jsoup.parse(htmlBody);
            Elements elements = doc.getElementsByTag("P");
            for (int i = 0; i < elements.size(); i++) {
                Element element = elements.get(i);
                System.out.println(element.text());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

运行主函数后,我们同样能获取相同的结果。

如果想了解 jsoup 更多使用方法,请参考以下专栏:http://blog.youkuaiyun.com/column/details/jsoup.html


四、Gson

Gson 是 Google 提供的用于解析 Json 数据的开源类库,相似的类库还有 Jackson、FastJson 等。

使用 Gson,需添加 jar 包:

  • gson-2.8.0.jar

一个简单的 Gson 解析 Json 数据示例,需要以下步骤:

  • 创建字段与 Json 数据相对应的 POJO;
  • 通过 Gson 实例的 fromJson(String json, Class<T> classOfT) 方法实现 Json 数据到 POJO 的映射;
  • 通过 POJO 字段获取目标内容。

现在,我们尝试解析出以下 Json 数据中的信息。

{
    name:"panda",
    age:18
}
package demo;

import com.google.gson.Gson;
import util.FileUtils;

/**
 * Gson demo
 *
 * @author panda
 * @date 2017/11/30
 */
public class GsonDemo {

    public static void main(String[] args) {
        String jsonString = FileUtils.readFile("json.txt", "UTF-8");

        Gson gson = new Gson();
        User user = gson.fromJson(jsonString, User.class);
        System.out.println("name:" + user.name);
        System.out.println("age:" + user.age);
    }

    private class User {
        private String name;
        private int age;
    }

}

运行主函数后,获取如下结果:

name:panda
age:18

如果想更全面地学习 Gson,请点这里:http://www.jianshu.com/p/e740196225a4

DCM4CHEE Archive Light 应用配置-存储配置 本文介绍了在DICOM归档系统中配置和管理存储的方法,包括通过用户界面和LDAP导入两种方式。主要内容包括: 存储配置概述:用户可根据需求配置单个或多个存储设备,支持在磁盘空间不足或多任务并行时使用。存储分为Archive设备级(序列元数据存储)和Application Entity级(对象存储/元数据存储)。 用户界面操作: 设备级存储配置:通过菜单导航添加/编辑存储描述符,设置Storage ID、URI等关键参数 应用级存储引用:在设备扩展和网络AE中分别配置元数据和对象存储引用 LDAP配置方法: 阅读详情

相关推荐

从UC3842的FB脚到COMP脚:一次讲透反激电源两种光耦反馈接法的选择与实战

本文深入探讨了UC3842 PWM控制器在反激式开关电源设计中的两种光耦反馈接法:FB脚与COMP脚方案。通过分析信号极性差异、稳定性特点及动态响应性能,提供场景化选型指南和可靠性设计要点,帮助工程师优化反馈环路设计,提升系统稳定性与效率。特别针对TL431和PC817等关键元件在温度漂移、老化衰减等实际问题给出解决方案。

weixin_28717683的博客 705

java动态爬虫jsoup以及正则表达式的运用

1.jsoup是java的HTML解析器,可直接解析某个URL地址,HTML文本内容。http://jsoup.org/官网 2.解析URL地址 1 Document doc = Jsoup 2 .connect(url) 3 .userAgent( 4 ...

weixin_30642305的博客 572

香橙派R1 Plus LTS变身无线AP/客户端:手把手教你用RTL8811CU和MT7601U网卡刷OpenWRT

本文详细介绍了如何将香橙派R1 Plus LTS开发板通过RTL8811CU和MT7601U两款USB无线网卡刷入OpenWRT系统,实现无线AP热点发射与客户端接入的双重功能。从硬件选型、驱动安装到双网卡协同配置,提供完整的实战指南,帮助用户快速搭建稳定高效的无线网络解决方案。

weixin_30919429的博客 408

Jsoup配合正则表达式爬取微信阅读榜单

这里写目录标题Document对象方法Element对象方法分析Re库Matcher 类的方法索引方法查找方法替换方法完整代码 Jsoup简介 主要功能 1. 从一个URL,文件或字符串中解析HTML 2. 使用DOM或CSS选择器来查找、取出数据使用DOM或CSS选择器来查找、取出数据 3. 可操作HTML元素、属性、文本可操作HTML元素、属性、文本 Document dom = Jsoup.connect("www.xxxx.com")..get(); Document对象方法 impor

weixin_51277037的博客 920

稳定性仿真(stb闭环增益仿真)

stb仿真主要是测试电路的稳定性,例如运放在闭环电路中的增益和相位裕度的值,从而判别电路是否正常工作。 以下是stb仿真的过程: (1)调用iprobe器件 从analogLib中调iprobe器件,通过器件中的箭头标识确定接入电路的方法,箭头起点端连运放的输出端,箭头的终点端连在反馈环路的作用端。iprobe器件连入电路后相当于理想导线。(iprobe器件连接在反馈回路上) (2)analyses设置 勾选stb和frequency,此处的频率范围设置在0.1~1GHz,Probe Instance/T

qq_36686804的博客 3万+

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 239

Java爬虫Jsoup+正则表达式爬取必应壁纸

Java爬虫Jsoup爬取必应壁纸 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.FileOutputStream; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DIYMain2 { public st

m0_56919521的博客 354

经典EMC案例-汽车车载电子行车记录仪显示屏EMC BCI整改案例

拿到这款汽车前装车载电子行车记录仪,小编首先在实验室还原客户描述的现象,确定现象符合客户的描述,再根据现象出现的对应频率做好记录,因为通常BCI FAIL的现象不局现于一个频率点,然后通过这些现象及频点,再结合产品的构造、线束,分析构思出大致解决方案。

jack_luo4913的博客 3738

Java 爬虫框架 webmagic 中三种 HTML&XML 页面信息抽取技术解析 -- Xpath & 正则表达式 & CSS选择器

本文详细介绍了用 Java 爬虫框架 webmagic 爬取网站数据的时候,从下载到的 HTML 页面抽取所需信息的三种技术的使用方法:XPath,正则表达式以及 CSS 选择器

ThinkingOverflow的博客 2100

ATAC-seq差异分析实战:从原始数据到GO富集(R/Bioconductor全流程)

本文提供了ATAC-seq差异分析的完整R/Bioconductor实战流程,涵盖从原始数据准备、一致峰集构建、计数矩阵生成,到使用DESeq2进行差异可及性分析,以及差异峰的基因组注释与GO富集分析。文章详细讲解了关键步骤、参数设置和常见问题,旨在帮助研究者获得可靠且可解释的生物学结果。

weixin_29246195的博客 228

2023,程序员的出路在哪里?

可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。

AI天才研究院 20万+

用正则表达式爬取数据,网络爬虫正则表达式

因此该段代码的作用就是控制这两种情况执行代码的过程,在该行代码下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。一次写的代码要有可扩展性,而不是只针对于具体的内容,最好是保留一个接口,这样可以使得爬虫的程序代码高效,因此需要进行input的输入,然后对于关键词的解析,存在着中文字符,就需要将其转化为可以识别的内容,这里导入urllib库中的parse模块进行关键词的解析,如下。关于第一条语句的使用,该行代码的意义是什么?

Rtee1的博客 919

外设测试 - ATAES132A 加解密芯片测试

原理 使用芯片官方提供的读写操作库,进行先写后读并校验,确认数据一致。 示例代码 int main(void) { uint8_t ret; aes132p_enable_interface(); ret = write_memory_test(); if (ret != AES132_FUNCTION_RETCODE_SUCCESS) { aes132p_disable_interface(); printf

一个软件工程师的技术笔记 859

【Python爬虫5】提取JS动态网页数据

动态网页示例 对加载内容进行逆向工程 1通过开发者工具的逆向工程 2通过墨盒测试的逆向工程 21搜索条件为空时 22用号匹配时 22用号匹配时 渲染动态网页 1使用WebKit渲染引擎 2使用Selenium自定义渲染 现在大部分的主流网站都用JavaScript动态显示网页内容,这样使得我们之前提取技术无法正常运行。本篇将介绍两种提取基于JS动态网页的数据。 JavaScript逆向工程 渲染Ja

Wu_Being 的优快云 博客 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

js正则表达式提取内容

介绍 var content="链接:https://pan.baidu.com/s/14Ohd4jLuMWLRtqIt6eUNKg\n提取码:5dlw\n复制这段内容后打开百度网盘手机App,操作更方便哦"; var reg = /链接:(.*)/; // https://pan.baidu.com/s/14Ohd4jLuMWLRtqIt6eUNKg console.log(reg.exec...

小识的博客 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

爬虫(利用正则表达式爬取百度新闻(淘宝))

先直接在百度新闻中搜索“淘宝” 得到url = “”" https://www.baidu.com/s?ie=utf-8&medium=0&rtt=1&bsst=1&rsv_dl=news_t_sk&cl=2&wd=%E6%B7%98%E5%AE%9D%E7%BD%91&tn=news&rsv_bp=1&rsv_sug3=12&rsv_sug1=3&rsv_sug7=100&oq=&rsv_sug2=0&

qq_42839893的博客 2178

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

爬虫之正则提取

以豆瓣电影排名前250为例,我们按f12打开开发者模式,点击element即可看见该网页的js代码,我们点击出现页面的左上角的小箭头,可以找到页面上每一处的对应源代码。 如果我想要拔取一条电影信息,则提取一条item即可,如图。 这里的class是属性,因此后面还要加上下划线 ...

hadeson12343的博客 543

爬虫数据提取-正则表达式

对于爬虫数据的提取解析,正则表达式是常用的工具,通过其各种匹配规则,我们可以方便的从页面提取我们想要的内容。

攀登Fox的博客 944

爬虫学习日志7--正则表达式提取json字符串

前言 这篇文章主要讲述正则表达式中对于json的提取。 一、代码 #根着视频学习的代码,记录分享一下 #1.导入相关模块 import requests import re from bs4 import BeautifulSoup #2.发送请求,获取疫情首页内容 response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia') home_page=response.content.decode() #print(home_page

taiyuezyh的博客 2418

网页内容提取常用正则表达式

hiheiheicdn的专栏 1861

网页爬虫之页面解析

前言 With the rapid development of the Internet,越来越多的信息充斥着各大网络平台。正如《死亡笔记》中L·Lawliet这一角色所提到的大数定律,在众多繁杂的数据中必然存在着某种规律,偶然中必然包含着某种必然的发生。不管是我们提到的大数定律,还是最近火热的大数据亦或其他领域都离不开大量而又干净数据的支持,为此,网络爬虫能够满足我们的需求,即在互联网上按照我...

Taoye | 玩世不恭的Coder 4700

浅析jsoup和正则运算

在用jsoup整理数据的时候经常会碰见一些多余的数据, 第一 譬如 李明,李明,李明 我只想要第一个,该如何去处理呢 可以加一个条件 if(数据.contains(",")){ 数据 = 数据.split(",")[0].trim(); } 特别注意,注意,里面替换的符号在获取的数据里面复制,因为你不知道里面是不是有什么英文半角什么中文半角符号什么的,不如直接复制数据里面的 第二 如果获取到的...

实用ai技巧 843

Java---Jsou或正则-抽取网页信息

利用Jsoup、正则抽取网页的标题、作者、发布时间以及正文 源网站 利用Jsoup进行抽取 public static void main(String[] args) { String url = "https://auto.gasgoo.com/a/70125507.html"; String sourceStr = getHTML(url, "UTF-8"); System.ou...

qq_41982466的博客 315

爬虫学习----解析网页

解析网页就是从服务器请求下来的网页数据中提取出我们需要的数据,常用的有三种方法:正则表达式解析网页、BeautifulSoup和lxml。 一、使用正则表达式解析网页 正则表达式就是对字符串操作的一种逻辑公式,就是用事先定义好的特定字符和这些特定字符的组合组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。因此,当我们获得网页数据后,就需要先将数据转换为字符串,之后再用正则表达式...

励志的小胡子 2868

数据解析-正则表达式与xpath

数据解析-正则表达式与xpath

weixin_48276319的博客 2122

XPath,正则表达式

电话号码:\d{3}-\d{8}|\d{4}-\d{7} QQ号:[1-9][0-9]{4,} 中国邮政编码:[1-9]\d{5}(?!\d) 身份证:\d{15}|\d{18} ip地址:\d+.\d+.\d+.\d+ [1-9]\d*  正整数 -[1-9]\d*   负整数 -?[1-9]\d* 整数 [1-9]\d*|0  非负整数 -[1-9]\d*|0   非正整数 [1-9]...

weixin_43213658的博客 2667
上一篇: 爬虫实战:使用 HttpClient 实现页面源码下载
下一篇: 爬虫实战:基于 HtmlParser 实现网页链接的提取
magicpenta
博客等级 码龄10年 42粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值