zoukankan      html  css  js  c++  java
  • 网页内容解析简单实现

    • 概述

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

      通过查找,最终找到了中华人民共和国国家统计局官网上有需要的地址数据,官方渠道,数据的准确性、完整性都有保障。本文采用国家统计局截止到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();
        }
    }

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

  • 相关阅读:
    jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
    linux 查看服务器cpu 与内存配置
    arthas 使用总结
    selinux contexts 安全上下文的临时更改
    Android 8.1 Doze模式分析(五) Doze白名单及Debug方式
    Window 任意窗口置顶软件Window TopMost Control
    Android ApkToolPlus一个可视化的跨平台 apk 分析工具
    SVN Please execute the 'Cleanup' command.
    Android 如何在64位安卓系统中使用32位SO库
    Android cmd命令查看apk是32位还是64位?
  • 原文地址:https://www.cnblogs.com/rexfang/p/6806502.html
Copyright © 2011-2022 走看看