zoukankan      html  css  js  c++  java
  • Jsoup-数据抽取

    使用DOM方法来遍历一个文档

    你有一个HTML文档要从中提取数据,并了解这个HTML文档的结构。

    将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。示例代码:

        @Test
        public void getData() throws IOException{
            File input = new File("tmp/input.html");
            Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
            Element content = doc.getElementById("content");
            Elements links = content.getElementsByTag("a");
            for (Element link : links) {
                  String linkHref = link.attr("href");
                  System.out.print(linkHref);
                  String linkText = link.text();
                  System.out.println(linkText);
                }
            
        }

    Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:

    查找元素

    元素数据

    操作HTML和文本

    使用选择器语法来查找元素

    你想使用类似于CSS或jQuery的语法来查找和操作元素。

    可以使用Element.select(String selector) 和 Elements.select(String selector) 方法实现:

        @Test
        public void getDataSelectorSsyntax() throws IOException{
            File input = new File("tmp/input.html");
            Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
            
            Elements links = doc.select("a[href]");// a with href
            
            Elements pngs = doc.select("img[src$=.png]");// img with src ending .png
            
            Element masthead = doc.select("div.masthead").first();// div with class=masthead
            
            Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
            
            System.out.println("links:"+links);
            System.out.println("pngs:"+pngs);
            System.out.println("masthead:"+masthead);
            System.out.println("resultLinks:"+resultLinks);
        }    

    jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。.

    这个select 方法在DocumentElement,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

    Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

    Selector选择器概述

    • tagname: 通过标签查找元素,比如:a
    • ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 <fb:name> 元素
    • #id: 通过ID查找元素,比如:#logo
    • .class: 通过class名称查找元素,比如:.masthead
    • [attribute]: 利用属性查找元素,比如:[href]
    • [^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
    • [attr=value]: 利用属性值来查找元素,比如:[width=500]
    • [attr^=value][attr$=value][attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
    • [attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i).(png|jpe?g)]
    • *: 这个符号将匹配所有元素

    Selector选择器组合使用

    • el#id: 元素+ID,比如: div#logo
    • el.class: 元素+class,比如: div.masthead
    • el[attr]: 元素+class,比如: a[href]
    • 任意组合,比如:a[href].highlight
    • ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有p元素
    • parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
    • siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
    • siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
    • el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo

    伪选择器selectors

    • :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
    • :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
    • :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
    • :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
    • :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class="logo" 元素的所有 div 列表
    • :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
    • :containsOwn(text): 查找直接包含给定文本的元素
    • :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
    • :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素
    • 注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等

    可以查看Selector API参考来了解更详细的内容

    从元素抽取属性,文本和HTML

    在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。

    示例:

        @Test
        public void getDataShuX(){
            String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
            Document doc = Jsoup.parse(html);//解析HTML字符串返回一个Document实现
            Element link = doc.select("a").first();//查找第一个a元素
            System.out.println(link);
            
            String text = doc.body().text(); // "An example link"//取得字符串中的文本
            System.out.println(text);
            String linkHref = link.attr("href"); // "http://example.com/"//取得链接地址
            System.out.println(linkHref);
            String linkText = link.text(); // "example""//取得链接地址中的文本
            System.out.println(linkText);
            String linkOuterH = link.outerHtml(); // "<a href="http://example.com"><b>example</b></a>"
            System.out.println(linkOuterH);
            String linkInnerH = link.html(); // "<b>example</b>"//取得链接内的html内容
            System.out.println(linkInnerH);
        }

    上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:

    这些访问器方法都有相应的setter方法来更改数据.

    处理URLs

    你有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs。

    1. 在你解析文档时确保有指定base URI,然后
    2. 使用 abs: 属性前缀来取得包含base URI的绝对路径。代码如下: 
        @Test
        public void getURLs() throws IOException{
            Document doc = Jsoup.connect("http://www.open-open.com").get();
            Element link = doc.select("a").first();
            System.out.println(link);
            String relHref = link.attr("href"); // == "/"
            System.out.println(relHref);
            String absHref = link.attr("abs:href"); // "http://www.open-open.com/"
            System.out.println(absHref);
        }

    在HTML元素中,URLs经常写成相对于文档位置的相对路径: <a href="/download">...</a>. 当你使用 Node.attr(String key) 方法来取得a元素的href属性时,它将直接返回在HTML源码中指定定的值。

    假如你需要取得一个绝对路径,需要在属性名前加 abs: 前缀。这样就可以返回包含根路径的URL地址attr("abs:href")

    因此,在解析HTML文档时,定义base URI非常重要。

    如果你不想使用abs: 前缀,还有一个方法能够实现同样的功能 Node.absUrl(String key)

    示例程序: 获取所有链接

    这个示例程序将展示如何从一个URL获得一个页面。然后提取页面中的所有链接、图片和其它辅助内容。并检查URLs和文本信息。

    运行下面程序需要指定一个URLs作为参数

    package com.bling.test;
    
    import java.io.IOException;
    
    import org.jsoup.Jsoup;
    import org.jsoup.helper.Validate;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    public class ListLinks {
         public static void main(String[] args) throws IOException {
             System.out.println(00+"="+args.length);
                Validate.isTrue(args.length == 1, "usage: supply url to fetch");
                String url = args[0];
                print("Fetching %s...", url);
                Document doc = Jsoup.connect(url).get();
                Elements links = doc.select("a[href]");
                Elements media = doc.select("[src]");
                Elements imports = doc.select("link[href]");
    
                print("
    Media: (%d)", media.size());
                for (Element src : media) {
                    if (src.tagName().equals("img"))
                        print(" * %s: <%s> %sx%s (%s)",
                                src.tagName(), src.attr("abs:src"), src.attr("width"), src.attr("height"),
                                trim(src.attr("alt"), 20));
                    else
                        print(" * %s: <%s>", src.tagName(), src.attr("abs:src"));
                }
    
                print("
    Imports: (%d)", imports.size());
                for (Element link : imports) {
                    print(" * %s <%s> (%s)", link.tagName(),link.attr("abs:href"), link.attr("rel"));
                }
    
                print("
    Links: (%d)", links.size());
                for (Element link : links) {
                    print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
                }
            }
    
            private static void print(String msg, Object... args) {
                System.out.println(String.format(msg, args));
            }
    
            private static String trim(String s, int width) {
                if (s.length() > width)
                    return s.substring(0, width-1) + ".";
                else
                    return s;
            }
    }

    运行结果:

    0=1
    Fetching http://news.dbanotes.net/...
    
    Media: (36)
     * script: <http://news.dbanotes.net/jailbreak.js>
     * img: <http://news.dbanotes.net/logo.png> 32x32 ()
     * img: <http://news.dbanotes.net/s.gif> 10x1 ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/grayarrow.png> x ()
     * img: <http://news.dbanotes.net/s.gif> 0x10 ()
    
    Imports: (2)
     * link <http://news.dbanotes.net/news.css> (stylesheet)
     * link <http://dbanotes.net/favicon.ico> (shortcut icon)
    
    Links: (144)
     * a: <http://news.dbanotes.net>  ()
     * a: <http://news.dbanotes.net/news>  (Startup News)
     * a: <http://news.dbanotes.net/newest>  (New)
     * a: <http://news.dbanotes.net/newcomments>  (Comments)
     * a: <http://news.dbanotes.net/leaders>  (Leaders)
     * a: <http://news.dbanotes.net/submit>  (Submit)
     * a: <http://news.dbanotes.net/x?fnid=1gnh0hqEqi>  (Login/Register)
     * a: <http://news.dbanotes.net/vote?for=17484&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://jianshu.io/p/07bc24a09364>  (创业这半年)
     * a: <http://news.dbanotes.net/user?id=laughing>  (laughing)
     * a: <http://news.dbanotes.net/item?id=17484>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17474&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.jikexueyuan.com/course/134.html/?hmsr=dbanotes_erweima>  (Android二维码扫描功能实战开发)
     * a: <http://news.dbanotes.net/user?id=jikexueyuan>  (jikexueyuan)
     * a: <http://news.dbanotes.net/item?id=17474>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17480&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://blog.segmentfault.com/teambition/1190000000517257>  (前端模块化杂谈)
     * a: <http://news.dbanotes.net/user?id=sf_team>  (sf_team)
     * a: <http://news.dbanotes.net/item?id=17480>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17464&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://jianshu.io/p/8cf2df3fdbf2>  (淘宝前端工程师:国内WEB前端开发十日谈)
     * a: <http://news.dbanotes.net/user?id=laughing>  (laughing)
     * a: <http://news.dbanotes.net/item?id=17464>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17477&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://yedingding.com/2014/07/09/deliver-better-product-i.html>  (Deliver Better Product (I))
     * a: <http://news.dbanotes.net/user?id=yedingding>  (yedingding)
     * a: <http://news.dbanotes.net/item?id=17477>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17476&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://jianshu.io/p/102e2459604e>  (UnityTestTool实用解释)
     * a: <http://news.dbanotes.net/user?id=laughing>  (laughing)
     * a: <http://news.dbanotes.net/item?id=17476>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17457&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://design.jikexueyuan.com/?hmsr=dbanotes_material>  (Android 「Material Design」官方文档中文版)
     * a: <http://news.dbanotes.net/user?id=jikexueyuan>  (jikexueyuan)
     * a: <http://news.dbanotes.net/item?id=17457>  (1 comment)
     * a: <http://news.dbanotes.net/vote?for=17468&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://shentar.me/dijkstra%E7%AE%97%E6%B3%95%E6%B1%82%E8%A7%A3%E6%9C%80%E7%9F%AD%E8%B7%AF%E5%BE%84%E5%88%86%E6%9E%90/>  (Dijkstra算法求解最短路径分析)
     * a: <http://news.dbanotes.net/user?id=sandy>  (sandy)
     * a: <http://news.dbanotes.net/item?id=17468>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17483&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://top.jobbole.com/1229/>  (SORTING:可视化展示排序算法的原理,支持单步查看)
     * a: <http://news.dbanotes.net/user?id=vicecity>  (vicecity)
     * a: <http://news.dbanotes.net/item?id=17483>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17482&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://top.jobbole.com/5754/>  (如果 Omni 体感游戏设备能普及的话,是不是可以帮宅男减肥呢?)
     * a: <http://news.dbanotes.net/user?id=vicecity>  (vicecity)
     * a: <http://news.dbanotes.net/item?id=17482>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17462&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.yyyweb.com/352.html>  (15款提高网站可用性和转化率的工具)
     * a: <http://news.dbanotes.net/user?id=fineweb>  (fineweb)
     * a: <http://news.dbanotes.net/item?id=17462>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17478&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://segmentfault.com/a/1190000000355928>  (PHP 开发者该知道的 5 个 Composer 小技巧)
     * a: <http://news.dbanotes.net/user?id=sf_team>  (sf_team)
     * a: <http://news.dbanotes.net/item?id=17478>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17467&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://daily.manong.io/2014-07-14>  (码农日报(2014/07/14) - 码农IO)
     * a: <http://news.dbanotes.net/user?id=pezy>  (pezy)
     * a: <http://news.dbanotes.net/item?id=17467>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17475&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.cnblogs.com/lhb25/p/html5-flah-web-file-uploader.html>  (Web Uploader - 功能齐全,完美兼容 IE 的上传组件)
     * a: <http://news.dbanotes.net/user?id=wentong>  (wentong)
     * a: <http://news.dbanotes.net/item?id=17475>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17460&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.ruanyifeng.com/blog/2014/07/chinese_fonts.html>  (中文字体网页开发指南 - 阮一峰的网络日志)
     * a: <http://news.dbanotes.net/user?id=pezy>  (pezy)
     * a: <http://news.dbanotes.net/item?id=17460>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17459&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://ourjs.com/detail/53c360e2332f1f1808000008>  (在nginx中使用lua脚本)
     * a: <http://news.dbanotes.net/user?id=c52u>  (c52u)
     * a: <http://news.dbanotes.net/item?id=17459>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17471&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.yyyweb.com/338.html>  (新入行程序员应知的十个秘密)
     * a: <http://news.dbanotes.net/user?id=fineweb>  (fineweb)
     * a: <http://news.dbanotes.net/item?id=17471>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17470&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://shentar.me/%E4%B8%83%E7%89%9B%E9%95%9C%E5%83%8F%E5%AD%98%E5%82%A8%E8%AF%95%E7%94%A8%E6%89%8B%E8%AE%B0/>  (七牛镜像存储试用手记)
     * a: <http://news.dbanotes.net/user?id=sandy>  (sandy)
     * a: <http://news.dbanotes.net/item?id=17470>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17466&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://vdisk.weibo.com/s/aQrMod29ZXpBu>  (《破茧成蝶》迷你书)
     * a: <http://news.dbanotes.net/user?id=websec>  (websec)
     * a: <http://news.dbanotes.net/item?id=17466>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17465&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://blog.jobbole.com/73509/>  (Android每周热点第二十三期)
     * a: <http://news.dbanotes.net/user?id=vicecity>  (vicecity)
     * a: <http://news.dbanotes.net/item?id=17465>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17416&dir=up&whence=%6e%65%77%73>  ()
     * a: <https://community.emc.com/message/825630#825630>  (一站式学习Wireshark(七):Statistics统计工具功能.)
     * a: <http://news.dbanotes.net/user?id=zoe_magic>  (zoe_magic)
     * a: <http://news.dbanotes.net/item?id=17416>  (6 comments)
     * a: <http://news.dbanotes.net/vote?for=17463&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.cnblogs.com/lhb25/p/concise-css-framework.html>  (Concise - 面向对象的,一致的前端开发框架)
     * a: <http://news.dbanotes.net/user?id=wentong>  (wentong)
     * a: <http://news.dbanotes.net/item?id=17463>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17445&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://blog.segmentfault.com/alan/1190000000603029>  (透支生命三个月)
     * a: <http://news.dbanotes.net/user?id=sf_team>  (sf_team)
     * a: <http://news.dbanotes.net/item?id=17445>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17447&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.javaranger.com/archives/1248>  (Maven快速构建springmvc+mybatis项目)
     * a: <http://news.dbanotes.net/user?id=ppking>  (ppking)
     * a: <http://news.dbanotes.net/item?id=17447>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17455&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.geekfan.net/10419/>  (将树莓派打造成音乐播放服务器)
     * a: <http://news.dbanotes.net/user?id=kkop>  (kkop)
     * a: <http://news.dbanotes.net/item?id=17455>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17453&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.importnew.com/12383.html>  (Java程序员须知的七个日志管理工具)
     * a: <http://news.dbanotes.net/user?id=importnew>  (importnew)
     * a: <http://news.dbanotes.net/item?id=17453>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17451&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://blog.jobbole.com/73134/>  (我做自由开发者学到的 4 个教训)
     * a: <http://news.dbanotes.net/user?id=vicecity>  (vicecity)
     * a: <http://news.dbanotes.net/item?id=17451>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17417&dir=up&whence=%6e%65%77%73>  ()
     * a: <https://community.emc.com/docs/DOC-36515>  (私有云项目实施的四个阶段)
     * a: <http://news.dbanotes.net/user?id=zoe_magic>  (zoe_magic)
     * a: <http://news.dbanotes.net/item?id=17417>  (5 comments)
     * a: <http://news.dbanotes.net/vote?for=17433&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://www.yyyweb.com/333.html>  (值得一试的8个最佳云端集成开发环境)
     * a: <http://news.dbanotes.net/user?id=fineweb>  (fineweb)
     * a: <http://news.dbanotes.net/item?id=17433>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17428&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://segmentfault.com/a/1190000000349384>  (30天学习30种新技术系列)
     * a: <http://news.dbanotes.net/user?id=sf_team>  (sf_team)
     * a: <http://news.dbanotes.net/item?id=17428>  (discuss)
     * a: <http://news.dbanotes.net/vote?for=17410&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://lewoer.com/blog/why-move-lewoer-to-usa/>  (创业转型 – 为什么将乐窝转到美国)
     * a: <http://news.dbanotes.net/user?id=yang140>  (yang140)
     * a: <http://news.dbanotes.net/item?id=17410>  (1 comment)
     * a: <http://news.dbanotes.net/vote?for=17443&dir=up&whence=%6e%65%77%73>  ()
     * a: <http://jianshu.io/p/247fa7f41aef>  (技术之外之画出最合适的趋势图)
     * a: <http://news.dbanotes.net/user?id=laughing>  (laughing)
     * a: <http://news.dbanotes.net/item?id=17443>  (discuss)
     * a: <http://news.dbanotes.net/x?fnid=EuRsZdHc43>  (More)
     * a: <http://dbanotes.net>  (DBA Notes)
     * a: <http://news.dbanotes.net/rss>  (RSS)
     * a: <https://jobsdigg.com/>  (Jobs)
     * a: <http://news.ycombinator.com/>  (Hacker News)
     * a: <https://github.com/nex3/arc/>  (GitHub)
     * a: <http://arclanguage.org/forum>  (Arc)
     * a: <https://itunes.apple.com/us/app/id611072155>  (iPhone/iPad)
     * a: <http://halzhang.github.com/StartupNews/>  (Android)
  • 相关阅读:
    C++笔记(2018/2/6)
    2017级面向对象程序设计寒假作业1
    谁是你的潜在朋友
    A1095 Cars on Campus (30)(30 分)
    A1083 List Grades (25)(25 分)
    A1075 PAT Judge (25)(25 分)
    A1012 The Best Rank (25)(25 分)
    1009 说反话 (20)(20 分)
    A1055 The World's Richest(25 分)
    A1025 PAT Ranking (25)(25 分)
  • 原文地址:https://www.cnblogs.com/yangml/p/3847617.html
Copyright © 2011-2022 走看看