网页内容解析简单实现

  • 概述

  在日常开发工作中,有时候我们需要去一些网站上抓取数据,要想抓取数据,就必须先了解网页结构,根据具体的网页结构,编写对应的程序对数据进行采集。最近刚好有一个需求,需要更新收货地址。由于系统现有的收货地址是很早以前的数据了,用户在使用的过程中反映找不到用户所在地的地址信息,因此对现有地址数据的更新也就提上了日程。

  通过查找,最终找到了中华人民共和国国家统计局官网上有需要的地址数据,官方渠道,数据的准确性、完整性都有保障。本文采用国家统计局截止到2016年7月31日公布的数据(目前最新的数据)为例子进行演示,有关页面结构的分析我这里就不多说了(开发基本技能),直接上代码吧,并附上完整的DEMO

  • 需要解析页面效果

  • POM 配置文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>crawler</groupId>
  <artifactId>crawler</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
      <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.7.2</version>
    </dependency>

    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk13</classifier><!--指定jdk版本-->
    </dependency>
  </dependencies>
</project>
  • 地址节点 Location 文件
package crawler;

import java.util.List;
public class Location {
    String code;
    String name;
    List<Location> children;

    public Location(){

    }

    public Location(String code, String name){
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Location> getChildren() {
        return children;
    }

    public void setChildren(List<Location> children) {
        this.children = children;
    }
}
  • 测试类 TestMain
package crawler;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

import net.sf.json.JSONObject;

public class TestMain {
    public static void main(String[] args) throws IOException {
        Document doc = Jsoup.connect("http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html").get();
        Element masthead = doc.select("div.xilan_con").first().
                getElementsByClass("TRS_Editor").first().
                getElementsByClass("TRS_PreAppend").first();
        Elements allElements = masthead.getElementsByTag("p");

        List<Location> provinceList = new ArrayList<Location>();
        Location province = null;
        Location city = null;
        for(Element element : allElements){
            String html = element.select("span[lang]").first().html();
            String locationCode = TestMain.getLocationCode(html);
            String locationName = element.select("span[style]").last().html();
            if(locationCode.endsWith("0000")){    //省或直辖市
                province = new Location(locationCode, locationName);
                province.setChildren(new ArrayList<Location>());
                provinceList.add(province);
            }else if(locationCode.endsWith("00")){    //市
                city = new Location(locationCode, locationName);
                city.setChildren(new ArrayList<Location>());
                province.getChildren().add(city);
            }else{    //县或区
                Location county = new Location(locationCode, locationName);
                city.getChildren().add(county);
            }
        }

        Location root = new Location("0", "root");
        root.setChildren(provinceList);
        JSONObject jsonObj = JSONObject.fromObject(root);
        System.out.println(jsonObj.toString());
    }

    public static String getLocationCode(String html){
        String regEx="[^0-9]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(html);
        return m.replaceAll("").trim();
    }
}

欢迎转载,转载必须标明出处

时间: 2024-10-17 01:01:56

网页内容解析简单实现的相关文章

解析简单xml文档

一.解析简单的xml文档 使用xml.etree.ElementTree 下的parse() xmlName.xml的文档的内容如下: <?xml version="1.0"?> <data> <country name="zhongguo"> <rank updated="yes">2</rank> <year >2017</year> <gdppc>

seajs模块路径解析 简单总结

seajs模块路径解析 最近在试着用seajs + grunt改造现有项目, 遇到的最大的问题就是seajs命名与调用, 简单总结一下. 模块调用 seajs中调用模块有两种方式,seajs.use(ID) . require(ID). ID命名 完整绝对路径 例如 "http://example.com/test/js/jquery/jquery.js" 以 "." 开头 例如 "./home/main" "../main"

利用GSON解析简单Json字符串

之前一直使用fastjson来解析json串,性能高,上手快,简单易学不错的! 最新听说fastjson爆出一个安全漏洞,只能寻找新的json库替代,就找到了gson,google开发的一款解析json的库, 平时工作中,复杂的json串解析用不太多,一般就是最基本的json串 用gson解析简单json串的示例如下: String jsonString = "{\"uid\":\"189024\", \"region\":\"

服务器架设笔记——使用Apache插件解析简单请求

一般来说,对于一个请求,服务器都会对其进行解析,以确定请求的合法性以及行进的路径.于是本节将讲解如何获取请求的数据.(转载请指明出于breaksoftware的csdn博客) 我们使用<服务器架设笔记--编译Apache及其插件>一文中的方法创建一个Handler工程--get_request.该工程中,我们可以操作的入口函数是 static int get_request_handler(request_rec *r) { r->content_type = "text/ht

Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串

最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作. 索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折. 我是在一个博客上抓取的.但是这位朋友的博客应该是在做防盗链,但他的方式比较简单就是5位数的一个整形随机数.这里折腾一下就ok了. 要命的是他这个链接的流类型 居然是gzip.这个郁闷好久,一直以为是编码格式导致解析不出来结果,后来发现是gzip搞的. 主要的一段代码做个记录吧. 1 /** 2 * 网络工具类 用于

Android Json解析简单高效之org.json,取值如囊中取物

我们通常在Android上采用Gson来解析Json数据,很方便的就可以把数据转换成List或者map.当碰到日期时间的时候,你可能会遇到坑,需要格式化一下日期时间格式. 本文介绍org.json这种不需要导入任何包的解析方式,不管Json多少层,如探囊取物. 1.解析{"":""} 格式的 JSONObject 如何确认是这种格式,我们都不需要看,打开 http://json.cn (Json在线解析及格式化验证网站),把Json数据直接粘贴到左边,如果是正确的J

.NET Core 实现 腾讯云云解析简单客户端

一.说明 腾讯云的.NET SDK虽然非常强大,但是对他的产品支持不是很完全,域名的云解析就没有SDK,所以自己写了一个,初衷是用来做动态DNS的,也准备接入多个云厂商,但是我自己本身仅仅只有腾讯云这个环境,所以目前仅支持腾讯云,然后API也非常简单,就是增删改域名解析记录. 本项目开源:https://github.com/stulzq/DynamicDns 二.使用 安装(Nuget):Install-Package DynamicDns.TencentCloud API 说明: IDyna

XML解析(简单)

获取解析文件路径    NSString * xmlPath = [[NSBundle mainBundle] pathForResource:@"Citys" ofType:@"xml"]; 2.初始化xml字符串    NSString * xmlStr = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil]; 3.初始化一个GDataXMLDoc

Netty学习笔记之一(Netty解析简单的Http Post Json 请求)

一,HTTP解码器可能会将一个HTTP请求解析成多个消息对象. ch.pipeline().addLast(new HttpServerCodec()); ch.pipeline().addLast(new ParseRequestHandler()); 经过HttpServerCodec解码之后,一个HTTP请求会导致:ParseRequestHandler的 channelRead()方法调用多次(测试时 "received message"输出了两次) @Override pub