精华内容
下载资源
问答
  • 使用lxml解析HTML数据

    千次阅读 2017-07-05 10:46:50
    HTML数据解析 诸如爬虫类场景下我们需要对抓取的HTML做内容解析,提取感兴趣的内容,python标准库提供了HTMLParser\SGMLParser两个模块用于解析HTML,然而这两个模块的实现方式都很难理解,用来做遍历查找实在是很...
    
    

    HTML数据解析

    诸如爬虫类场景下我们需要对抓取的HTML做内容解析,提取感兴趣的内容,python标准库提供了HTMLParser\SGMLParser两个模块用于解析HTML,然而这两个模块的实现方式都很难理解,用来做遍历查找实在是很不友好,第三方库lxml则简单许多,逻辑上更容易理解,而且同时支持HTML和XML两类结构化数据解析

    用官方话说:

    “lxml provides a very simple and powerful API for parsing XML and HTML. It supports one-step parsing as well as step-by-step parsing using an event-driven API (currently only for XML).”

    Parsing HTML with lxml

    从html中提取感兴趣的内容, 一种选择是用正则表达式, 不过正则表达式写起来太痛苦,万不得已不用也罢。html语言可以看做是类似xml的层次化结构语言, 可以解析成一个树,然后用xpath语言做数据定位提取.

    实现一个小爬虫的思路

    Python Documentation 中 HTMLParser章节Example中用一个网站做演示如何使用HTMLParser解析HTML,这里我也借用这个网站做演示,该网站总工有10页,页面下方有“Next”链接到下一页,内容是罗列一堆名人名言,关键信息为“名言”、“作者”、“关键字”,我就遍历这10个页面并提取这三个信息。

    http://quotes.toscrape.com

    • requests.get(url)抓取一个链接的页面;
    • 抓取的页面字符形式喂给 lxml.html.fromstring();
    • XPath定位并提取感兴趣的内容;
    • 数据写入MySQL;

    代码 & Walk Through

    
    #-*- coding:utf-8 -*-
    '''
    Created on 2017年7月3日
    
    @author: will
    '''
    import MySQLdb
    from lxml import html
    import requests
    
    class Pipeline():
        '''
        数据库连接,已在MySQL Server上提前创建db = Locust
        '''
        connDB = MySQLdb.connect(
            host = '192.168.8.82',
            port = 3306,
            user = 'willyan',
            passwd = 'will392891',
            db = 'Locust',
            charset = 'utf8'
            )
        cur = connDB.cursor()
        
    class HtmlPar():
        '''
        解析并提取html文件中的感兴趣信息,
        '''    
        def myPar(self,start_url):
            ##创建urls列表,用于存放待爬取的页面链接
            ##爬虫起始页链接start_url需要作为参数传入并存放到urls[],提取页面底部“Next"的 href 添加到urls[]
            urls = []
            urls.append(start_url)
            ##创建三个list分别用于存放提取到的名言、作者、关键字
            text = []
            author = []
            tags = []
    
            '''
            定义一个条件循环体,从urls[]中提取待爬取页面的链接,爬取结果以字符形式喂给解析器,提取“Next”元素,若“Next”元素存在,则将其“href”信息添加到urls[]列表中,作为下一次循环爬取的目标链接,同时提取页面中的全部“名言Text”、“作者author”、“关键字 tags”分别添加到对应的list,当爬取的页面中定位不到“Next"元素时说明已到达最后一页跳出循环并将提取到的三个List返回。
            '''       
            i = 0
            while True:
                #从urls[]依次取待爬取页面链接,爬取结果以字符形式喂给解析器
                page = requests.get(urls[i])
                tree = html.fromstring(page.text)
                #提取页面底部的“Next”元素,作为判读是否继续爬取的依据
                nextPage = tree.xpath('//nav/ul/li[@class="next"]/a/@href')
                ##当nextPage 返回为空[]时,说明已到末页,应终止循环并将提取到的全部数据返回
                if nextPage != []:
                    #提取当前页面“Next”元素的“href”链接数据,并添加到urls[]作为下一次循环的爬取目标
                    urls.append(urls[0] + tree.xpath('//nav/ul/li[@class="next"]/a/@href')[0])
                    #提取的名言、作者、关键字三个信息都是以list[]形式返回,以len()函数识别其中一个对象的长度(如名言或作者),定义for循环将返回的三个list[]内容依次添加到text[]、author[]、tags[]中。
                    num = len(tree.xpath('//span[@itemprop="text"]/text()'))
                    for x in range(num):
                        text.append(tree.xpath('//span[@itemprop="text"]/text()')[x])
                        author.append(tree.xpath('//small[@itemprop="author"]/text()')[x])
                        tags.append(tree.xpath('//meta/@content')[x])
                else:
                    return text, author, tags
                i += 1
            
    if __name__ == '__main__':
        #数据库中建表qutes,用于存放抓取的数据
        db = Pipeline()
        conn = db.connDB
        cur = db.cur
        dbCreateCMD = 'create table quotes(quoteID varchar(10), quoteText varchar(600), author varchar(20), tags varchar(20), primary key (quoteID), unique(quoteID)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
        cur.execute(dbCreateCMD)
        
        #定义起始爬取页
        start_url = 'http://quotes.toscrape.com'
        quotes = HtmlPar()
        result =  quotes.myPar(start_url)
        #将返回的三维元组数据循环写入数据库,返回数据格式为: result(text[...],author[...],tags[...])
        for y in range(len(result[0])):
            #Text部分有的条目字符数太多,超过MySQL字符限制无法写入,所以text部分就不写库了。。。
            cmd = "insert ignore into quotes(quoteID, author, tags) values('" + str(y+1) + "', '" + result[1][y] + "', '" + result[2][y] + "')"
            cur.execute(cmd)
            conn.commit()
            
        cur.close()
        conn.close()
    
    

    执行结果

    进数据库Locust查看,总计抓取了90条内容。

    mysql> select * from quotes;
    Empty set (0.01 sec)
    
    mysql> select * from quotes;
    +---------+-----------+----------------------+----------------------+
    | quoteID | quoteText | author               | tags                 |
    +---------+-----------+----------------------+----------------------+
    | 1       | NULL      | Albert Einstein      | change,deep-thoughts |
    | 10      | NULL      | Steve Martin         | humor,obvious,simile |
    | 11      | NULL      | Marilyn Monroe       | friends,heartbreak,i |
    | 12      | NULL      | J.K. Rowling         | courage,friends      |
    | 13      | NULL      | Albert Einstein      | simplicity,understan |
    | 14      | NULL      | Bob Marley           | love                 |
    | 15      | NULL      | Dr. Seuss            | fantasy              |
    | 16      | NULL      | Douglas Adams        | life,navigation      |
    | 17      | NULL      | Elie Wiesel          | activism,apathy,hate |
    | 18      | NULL      | Friedrich Nietzsche  | friendship,lack-of-f |
    | 19      | NULL      | Mark Twain           | books,contentment,fr |
    | 2       | NULL      | J.K. Rowling         | abilities,choices    |
    | 20      | NULL      | Allen Saunders       | fate,life,misattribu |
    | 21      | NULL      | Pablo Neruda         | love,poetry          |
    | 22      | NULL      | Ralph Waldo Emerson  | happiness            |
    | 23      | NULL      | Mother Teresa        | attributed-no-source |
    | 24      | NULL      | Garrison Keillor     | humor,religion       |
    | 25      | NULL      | Jim Henson           | humor                |
    | 26      | NULL      | Dr. Seuss            | comedy,life,yourself |
    | 27      | NULL      | Albert Einstein      | children,fairy-tales |
    | 28      | NULL      | J.K. Rowling         |                      |
    | 29      | NULL      | Albert Einstein      | imagination          |
    | 3       | NULL      | Albert Einstein      | inspirational,life,l |
    | 30      | NULL      | Bob Marley           | music                |
    | 31      | NULL      | Dr. Seuss            | learning,reading,seu |
    | 32      | NULL      | J.K. Rowling         | dumbledore           |
    | 33      | NULL      | Bob Marley           | friendship           |
    | 34      | NULL      | Mother Teresa        | misattributed-to-mot |
    | 35      | NULL      | J.K. Rowling         | death,inspirational  |
    | 36      | NULL      | Charles M. Schulz    | chocolate,food,humor |
    | 37      | NULL      | William Nicholson    | misattributed-to-c-s |
    | 38      | NULL      | Albert Einstein      | knowledge,learning,u |
    | 39      | NULL      | Jorge Luis Borges    | books,library        |
    | 4       | NULL      | Jane Austen          | aliteracy,books,clas |
    | 40      | NULL      | George Eliot         | inspirational        |
    | 41      | NULL      | George R.R. Martin   | read,readers,reading |
    | 42      | NULL      | C.S. Lewis           | books,inspirational, |
    | 43      | NULL      | Marilyn Monroe       |                      |
    | 44      | NULL      | Marilyn Monroe       | girls,love           |
    | 45      | NULL      | Albert Einstein      | life,simile          |
    | 46      | NULL      | Marilyn Monroe       | love                 |
    | 47      | NULL      | Marilyn Monroe       | attributed-no-source |
    | 48      | NULL      | Martin Luther King J | hope,inspirational   |
    | 49      | NULL      | J.K. Rowling         | dumbledore           |
    | 5       | NULL      | Marilyn Monroe       | be-yourself,inspirat |
    | 50      | NULL      | James Baldwin        | love                 |
    | 51      | NULL      | Jane Austen          | friendship,love      |
    | 52      | NULL      | Eleanor Roosevelt    | attributed,fear,insp |
    | 53      | NULL      | Marilyn Monroe       | attributed-no-source |
    | 54      | NULL      | Albert Einstein      | music                |
    | 55      | NULL      | Haruki Murakami      | books,thought        |
    | 56      | NULL      | Alexandre Dumas fils | misattributed-to-ein |
    | 57      | NULL      | Stephenie Meyer      | drug,romance,simile  |
    | 58      | NULL      | Ernest Hemingway     | books,friends,noveli |
    | 59      | NULL      | Helen Keller         | inspirational        |
    | 6       | NULL      | Albert Einstein      | adulthood,success,va |
    | 60      | NULL      | George Bernard Shaw  | inspirational,life,y |
    | 61      | NULL      | Charles Bukowski     | alcohol              |
    | 62      | NULL      | Suzanne Collins      | the-hunger-games     |
    | 63      | NULL      | Suzanne Collins      | humor                |
    | 64      | NULL      | C.S. Lewis           | love                 |
    | 65      | NULL      | J.R.R. Tolkien       | bilbo,journey,lost,q |
    | 66      | NULL      | J.K. Rowling         | live-death-love      |
    | 67      | NULL      | Ernest Hemingway     | good,writing         |
    | 68      | NULL      | Ralph Waldo Emerson  | life,regrets         |
    | 69      | NULL      | Mark Twain           | education            |
    | 7       | NULL      | André Gide           | life,love            |
    | 70      | NULL      | Dr. Seuss            | troubles             |
    | 71      | NULL      | Alfred Tennyson      | friendship,love      |
    | 72      | NULL      | Charles Bukowski     | humor                |
    | 73      | NULL      | Terry Pratchett      | humor,open-mind,thin |
    | 74      | NULL      | Dr. Seuss            | humor,philosophy     |
    | 75      | NULL      | J.D. Salinger        | authors,books,litera |
    | 76      | NULL      | George Carlin        | humor,insanity,lies, |
    | 77      | NULL      | John Lennon          | beatles,connection,d |
    | 78      | NULL      | W.C. Fields          | humor,sinister       |
    | 79      | NULL      | Ayn Rand             |                      |
    | 8       | NULL      | Thomas A. Edison     | edison,failure,inspi |
    | 80      | NULL      | Mark Twain           | books,classic,readin |
    | 81      | NULL      | Albert Einstein      | mistakes             |
    | 82      | NULL      | Jane Austen          | humor,love,romantic, |
    | 83      | NULL      | J.K. Rowling         | integrity            |
    | 84      | NULL      | Jane Austen          | books,library,readin |
    | 85      | NULL      | Jane Austen          | elizabeth-bennet,jan |
    | 86      | NULL      | C.S. Lewis           | age,fairytales,growi |
    | 87      | NULL      | C.S. Lewis           | god                  |
    | 88      | NULL      | Mark Twain           | death,life           |
    | 89      | NULL      | Mark Twain           | misattributed-mark-t |
    | 9       | NULL      | Eleanor Roosevelt    | misattributed-eleano |
    | 90      | NULL      | C.S. Lewis           | christianity,faith,r |
    +---------+-----------+----------------------+----------------------+
    90 rows in set (0.01 sec)
    

    多线程优化

    对于页面数较多的站点爬取可以考虑使用multiprocessing库做多线程处理,先爬取所有页面的链接,再以多线程做爬取页面和数据提取以提高爬虫效率。

    展开全文
  • 怎么利用xpath解析html数据

    千次阅读 2014-05-05 10:25:08
    但是使用了所有的解析html的类库,但是不是很理想,就在去年自己封装了一个,结果还是十分的满意的。 下面我就说一下关于怎么进行xpath进行一步步的解析 第一步:下载我封装的类库 parse_...

    去年的时候一直想做一些东西,但是因为服务器自己不会搭建,数据自己也是没有,自己就萌发了一下关于解析别人网页上面的数据使用的念头。但是使用了所有的解析html的类库,但是不是很理想,就在去年自己封装了一个,结果还是十分的满意的。


    下面我就说一下关于怎么进行xpath进行一步步的解析


    第一步:下载我封装的类库 parse_html_for_xpath 下载地址


    箭头所指的地方就是下载的地方,大家也可以收藏自己修改

    把解压出来的包里面的ZH_Parse_html的包直接的拖在工程里面


    因为我解析的原型还是利用前人车轮,谷歌的GDataXml

    所以大家需要添加libXml.dylib库


    经常搞xml的应该知道还需要添加头文件,不然系统识别不了


    这样的话工程就可以正常的运行了。

    2.进行html解析

    打开我们需要找到数据的网页,比如我们利用寻找xpath语法再百度是这个样子


    我们想要找到图上面的标题和连接。

    我们就选中这个标题,是这样的


    然后我们单击右键查看元素,我使用的是火狐浏览器


    箭头所指带的就是我们要找到的xpath,我么点击右键选着view xpath这个插件大家可以再火狐插件寻找安装


    我们从刚才的图获取到xpath是这个html/body/div/div/div/div/div/h3/a

    在viewxpath测试是这样的


    看来已经可以解析了,我们在工程里面测试一下。


    最后结果返回是这样的


    从图中看到了十条数据,看来已经解析出来,每一条里面的标题和连接我们逗得到了。这就是解析html的全部过程。谢谢大家



    展开全文
  • 解析返回数据content > <div class="card-content" v-html="article.content"></div> 这个是返回的数据 ![图片说明](https://img-ask.csdn.net/upload/201901/23/1548217701_928709.jpg) 如图所示只显示了文字...
  • 通过html解析网页数据

    千次阅读 2016-07-28 14:30:34
    最近遇到一个工作需要从新浪财经网页拉取某支股票的当天成交明细,于是乎发现了一个好用的第三方包,在这里跟大家分享一下...接下就来通过我这个项目来说明一下如何解析html 1.分析相应的html代码。 我要拉取的网页是ht

    最近遇到一个工作需要从新浪财经网页拉取某支股票的当天成交明细,于是乎发现了一个好用的第三方包,在这里跟大家分享一下。

    这个包叫Jsoup包,jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。

    jar包(点击下载

    中文api文档(点击查看


    接下就来通过我这个项目来说明一下如何解析html

    1.分析相应的html代码。

    我要拉取的网页是http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradehistory.php?symbol=sh601988&date=2016-07-26&page=41

    这是网页上显示的表格:

    我们要获取这个股票每个成交时间的成交价和涨跌幅。

    查看网页源代码发现主要这几行:

    数据是在一个叫datatb1的表格里面。


    2.这里源代码有接近有一千行,用Jsoup来解析就比较方便快捷了。

    贴上代码:

    public class GetDataFormNetWork {
    
        final String Url = "http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradehistory.php";
        List<StockInfo> mData = new ArrayList<StockInfo>();
        int mPage;
        public void get(final String date , final int page)
        {
            mPage = page;
            new Thread(new Runnable() {
                //开一个子线程来进行网络请求,用的是OKHttp
                @Override
                public void run() {
                    RequestBody body = new FormEncodingBuilder()
                            .add("symbol","sh601988")
                            .add("date",date)
                            .add("page",String.valueOf(page))
                            .build();
    
                    OkHttpClient mOkHttpClient = new OkHttpClient();
                    final Request request = new Request.Builder()
                            .url(Url)
                            .post(body)
                            .build();
                    try {
                        Response response = mOkHttpClient.newCall(request).execute();
                        if (response.isSuccessful()) {
                            String data = new String(response.body().bytes(),"GBK");
                            Message msg = Message.obtain();
                            msg.obj = data;
                            handler.sendMessage(msg);
    
                        } else {
    
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }).start();
        }
        public class StockInfo
        {
            String price;//成交价
            String time;//成交时间
            String increase;//涨跌幅
    
            public StockInfo(String time, String price,String increase) {
                this.price = price;
                this.time = time;
                this.increase = increase;
            }
        }
    
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                String data = (String) msg.obj;
                Document doc = Jsoup.parse(data);
                Element table = doc.select("table.datatbl").first();//获取名称为datatb1的表格
                Elements elements = table.getElementsByTag("tbody");
                for (int i=0;i<elements.size();i++)//遍历容器
                {
                    Element tr = elements.get(i);
                    Elements ths = tr.getElementsByTag("th");//获取th标签
                    Elements tds = tr.getElementsByTag("td");//获取td标签
                    for(int j=0;j<ths.size()/2;j++)
                    {
                        mData.add(new StockInfo(ths.get(2*j).text(),tds.get(5*j).text(),tds.get(5*j+1).text()));
                    }
                }
                mParse.onParse(mData,mPage);
    
            }
        };
    
        private Parse mParse;
    
        public interface Parse
        {
            abstract public void onParse(List<StockInfo> datas , int page);
        }
        public void setParse(Parse parse)
        {
            mParse  = parse;
        }
    }
    这样子,mData这个容器就存有这一页的表格数据了。注意的是,这里用到的是OkHttp进行网络请求,有兴趣的朋友可以到我的这篇博客来简单了解一下:http://blog.csdn.net/u014686721/article/details/52053304


    当然了,这还只是Jsoup的简单实用,具体的其他使用还要去查看API文档。


    ——————————

    总结:

    1.自己遇到网络请求获取回来的html是有乱码的,那是因为编码的问题,可以用GBK编码方式。

    2.Jsoup用select获取表格时,要在名字前面加上"table."

    3.Element对象同过getElementByTag返回的时候Elements的容器。Element对象通过text方法可以去掉标签返回字符串。



    展开全文
  • 抓取网页数据解析、Jsoup、

    参考:android 开发–抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)

    网页有两种格式,一种是xml另一种是html,目前似乎好像大部分都是html格式的,查看网页格式的方法是在浏览器中右键–>查看源码或者直接F12即可。

    一、XML解析

    1)DOM解析

    DOM(Document Object Mode)是将XML文件的所有内容以文档树的方式存在内存中,通过节点以及节点之间的关系来解析XML文件。由于DOM操作会将整个XML文件存放在内存中,所以消耗内存大,较大的文档不采用这种方法解析。

    2)SAX解析

    SAX解析,逐行扫描XML文档,遇到标签时触发姐系处理器,采用事件处理的方式解析XML,在读取文档的同时即可对XML进行处理。可以解析超大XML,但是SAX解析只能读取XML中的数据,无法对数据进行增删改

    3)PULL解析

    PULL解析器是一个开源Java项目,既可用于Android应用也可用于JavaEE程序。Android中集成了PULL解析器,因此,Android中常用的就是PULL解析
    此处提供一个xml地址:http://bbs.csdn.net/recommend_tech_topics.atom

    使用案例:

    此处使用pull解析的方式

    需要解析的xml:

     <entry>
        <id>http://bbs.csdn.net/topics/392114349</id>
        <published>2017-03-08T15:51:57+08:00</published>
        <updated>2017-12-19T15:04:26+08:00</updated>
        <link rel="alternate" type="text/html" href="http://bbs.csdn.net/topics/392114349"/>
        <title>dubbo下如何使用hibernate的级联操作</title>
        <summary>dubbo下如何使用hibernate的级联操作</summary>
        <author>a461666405</author>
      </entry>
     <!--部分代码,具体点击上面链接 -->

    根据xml内容分类创建实体类即可。

    新建一个XMLSerivce工具类用来解析xml

    public class XMLService {
        // 返回信息集合
        public static List<Bean> getNewsInfo(InputStream is) throws Exception {
            XmlPullParser parser = Xml.newPullParser(); // 获取Pull解析器
            parser.setInput(is, "utf-8");
            List<Bean> list = null;
            Bean bean = null;
    
            // 得到当前事件的类型
            int type = parser.getEventType();
    
            while (type != XmlPullParser.END_DOCUMENT) {
    
                switch (type) {
                    // XML文档的开始START_DOCUMENT 例如:<?xml version="1.0" encoding="UTF-8"?> 0
                    case XmlPullParser.START_DOCUMENT:
                        list = new ArrayList<>();
                        break;
                    // XML文档节点开始START_TAG 例如:<entry> 2
                    case XmlPullParser.START_TAG:
                        bean = new Bean();
                        if ("entry".equals(parser.getName())) {
                            Log.e("XML", "<ebtry>");
    
    
                        } else if ("id".equals(parser.getName())) {
                            String path = parser.nextText();
                            bean.setPath(path);
                            Log.e("XML", "path == " + path + "parse == " + parser.getName());
    
                        } else if ("published".equals(parser.getName())) {
                            String published = parser.nextText();
                            bean.setPublised(published);
                            Log.e("XML", "published == " + published + "parse == " + parser.getName());
    
                        } else if ("updated".equals(parser.getName())) {
                            String updtaed = parser.nextText();
                            bean.setUpdated(updtaed);
                            Log.e("XML", "updated == " + updtaed + "parse == " + parser.getName());
    
                        } else if ("title".equals(parser.getName())) {
                            String title = parser.nextText();
                            bean.setTitle(title);
                            Log.e("XML", "title == " + title + "parse == " + parser.getName());
    
                        } else if ("summary".equals(parser.getName())) {
                            String summary = parser.nextText();
                            bean.setUpdated(summary);
                            Log.e("XML", "summary == " + summary + "parse == " + parser.getName());
    
                        } else if ("author".equals(parser.getName())) {
                            String author = parser.nextText();
                            bean.setUpdated(author);
                            Log.e("XML", "author == " + author + "parse == " + parser.getName());
    
                        }
                        break;
                    // XML文档的结束节点 如</entry> 3
                    case XmlPullParser.END_TAG:
    
                        if ("entry".equals(parser.getName())) {
                            Log.e("XML", "解析xml一个节点完成" + parser.getName());
    
                            // 处理完一个entry标签
                            list.add(bean);
                            bean = null;
                        }
                        break;
                }
                type = parser.next(); // 解析下一个节点
            }
            return list;
        }
    }
    

    在Activity中,

    private void pullParseXml(){
    
            final Message message = new Message();
            beanList = new ArrayList<>();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    try {
                        URL url = new URL("http://bbs.csdn.net/recommend_tech_topics.atom");
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setConnectTimeout(5000);
                        int code = conn.getResponseCode();
                        if (code == 200){
                            Log.e("XML","请求成功");
                            InputStream is = conn.getInputStream();
                            beanList = XMLService.getNewsInfo(is);
                            Log.e("XML",beanList.size()+ "");
    
                            // 成功获取数据 给主线程发消息
                            message.what = 3;
                            handler.sendMessage(message);
                        }
    
                    } catch (Exception e) {
                        // 获取数据失败,给主线程发消息,处理数据
                        message.what = 4;
                        handler.sendMessage(message);
    
                        e.printStackTrace();
                    }
    
                }
            }).start();
    
        }

    得到的数据:
    pull解析xml

    二、Html解析

    数据源来自虎扑体育

    虎扑体育源码

    1)Jsoup

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

    Jsoup的主要功能:
    1. 从一个 URL,文件或字符串中解析 HTML;
    2. 使用 DOM 或 CSS 选择器来查找、取出数据;
    3. 可操作 HTML 元素、属性、文本;

    Jsoup的中文文档

    ——注释写在代码里—–

    使用前需要导入Jsoup的jar包,复制jar包AndroidStudio中lib目录下并右键Add As Library。点击下载

    使用案例

     private void getDataByJsoup(){
    
            final NewsInfo newsInfo = new NewsInfo();
            final Message message = new Message();
            newsList.add(newsInfo);
    
            // 开启一个新线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // 网络加载HTML文档
                        Document doc = Jsoup.connect("https://voice.hupu.com/nba")
                                .timeout(5000) // 设置超时时间
                                .get(); // 使用GET方法访问URL
                        Elements elements = doc.select("div.list-hd");
                        for (Element element:elements){
    
                            String title = element.select("a").text(); // 新闻标题
                            String url = element.select("a").attr("href"); // 新闻内容链接
                            newsInfo.setTitle(title);
                            newsInfo.setNewsUrl(url);
                            Log.e("TAG","Jsoup ======>>" + title + url);
                        }
                        Elements elements1 = doc.select("div.otherInfo");
                        for (Element element: elements1){
    
                            String time = element.select("a").text(); // 时间
                            newsInfo.setNewsTime(time);
                            Log.e("TAG","Jsoup ======>>" + time );
    
                        }
    
                        message.what = 1;
    
                    } catch (IOException e) {
                        message.what = 2;
                        e.printStackTrace();
                    }
                    handler.sendMessage(message);
    
                }
            }).start();
    
        }

    获取的数据:

    Jsoup获取的数据

    展开全文
  • Jsoup解析HTML获取数据

    千次阅读 2015-07-29 21:27:00
    前言   当进行和网络相关的开发,我们...没错,我们可以直接解析HTML页面,从中得到我们的数据,而今天我给大家介绍的就是一个非常好用的框架:Jsoup 实现   首先我们必须要知道从那里看到HTML的数据,这里我以笔趣
  • 解析html框架很多.比较一些框架的介绍以后,感觉jsoup更易使用. 而且在使用中发现jsoup还是很稳定的. 得到jsoup的jar包 , 下面是官网 http://jsoup.org/ 只有一个文件.开始以下步骤吧....   1,获取网站的...
  • Jsoup—解析HTML页面数据的工具

    千次阅读 2017-01-14 22:10:38
    它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作...jSOUP主要功能从一个URL,文件或字符串中解析HTML; 使用DOM或CSS选择器来查找、取出数据; 可操作HTML元素、属性、文本;依赖
  • C#,xml、html节点数据解析

    千次阅读 2015-12-12 13:36:31
    C#,xml、html节点数据解析
  • 昨天想用Jsoup抓取一个页面中的歇后语,没想到竟然遇到了这么一个奇葩问题,解析多条相同的数据的时候只解析到1条数据 比如解析如下内容 坐轿里骂人 不识抬举 坐轿打瞌睡 不识抬举 我解析td标签中的文本应该得到...
  • 谈如何解析Html并抓取数据

    万次阅读 2015-03-28 23:13:52
    最近加入了一家新公司,他们是一家电商,业务是网上虚拟充值,我进去是做OA里面的财务,本来想到的是做一做信息管理的,没想到还涉及到去别的网站采集数据解析Html,最终用采集到的数据生成财务凭证)这一环,这个...
  • 有时候开发Android客户端时,没有大量的数据,而且懒得自己收集数据,那么就可以尝试用Jsoup解析其他网站的数据。 我以解析我们学校网站的一条通知为例 即下图: ①首先应制定数据在什么标签中,可以通过按F12 ②...
  • Python beautiful soup解析html获得数据

    万次阅读 2019-02-24 02:01:21
    1. 用beautiful soup解析网页的HTML的信息 https://blog.csdn.net/i_chaoren/article/details/63282877 1.1 BeautifulSoup的安装及介绍 官方给出的几点介绍: Beautiful Soup提供一些简单的、python式的函数用来...
  • html解析json数据为表格table显示

    万次阅读 2017-12-13 16:09:34
    DOCTYPE html> <html> <title></title> <th>BrandName <th>Modul <th>Quantity <th>Datecode <th>Remark window.onload=function(){ var data=[{"BrandName":"ACES","Modul":"91906-0227P",...
  • 将网页的解析数据存储为html文件

    千次阅读 2017-02-05 23:11:05
    为了把从网页中解析数据存储起来,便于存档和查询,可以把数据存放在数据库中,也可以以文件的方式存储,还可以存储为网络应用程序,即html文件或者CSV格式文件。本文引用一个例子,看看如何将网页的解析数据存储...
  • DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> ...
  • 有个功能需要在网上抓取一些数据,本身数据格式是纯html格式的,但是后来别人网站的数据而是改变了,如下.我应该如何获取其中的某个节点的数据 ![![![图片说明]...
  • Layui数据表格解析任意数据格式问题

    千次阅读 2019-11-11 10:46:46
    如图所示我要解析的json格式为: 我的表格需要渲染list里面的数据然后我通过格式转换实现了,然而还需要在页面显示listnnum 和 listynum 的条数值,此时我用data.去取显示undefined... ,done: function (data, ...
  • Python数据解析

    千次阅读 2018-12-30 17:23:32
    Python语言在人工智能以及计算机视觉领域十分热门,它处理数据的能力很出色,兼容各种常用的数据类型解析。程序无非就是一系列数据操作行为的集合,从输入到输出以求得人们期望的结果。Python在执行效率和开发效率中...
  • 后台返回json数据和前台解析json数据 一般来说web开发中,前台采用json数据提交给后台,后台处理数据以后返回json数据给前台,前台解析json,显示数据。 总而言之,前后台直接交换的数据格式最常用的非json数据...
  • netcdf官方文档在 http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/tutorial/NetcdfFile.html 点击打开链接 大家多琢磨多调试,有问题加断点debug一步步跟就好了啊,尤其是上面链接里面加粗字的...
  • 我在网上获取了别人的html源代码后,把源代码保存到本地html,然后通过什么样的方法读取到里面table的数据,再根据这些数据构建一个新的html文件,再另存到本地 相当于这么一个软件,输入时别人的html源代码,...
  • angular解析json数据

    千次阅读 2017-10-13 19:11:52
    这篇文章主要介绍了AngularJS获取json数据的方法,给大家分享一个简单的Demo。 源码: html> html> head> meta charset="UTF-8"> script type="text/javascript" src="angular-1.3.0.js">script> title>title> ...
  • Andorid之Gson解析Json数据

    千次阅读 多人点赞 2016-02-03 14:51:16
    Json类型数据可以通过Json官方提供的方法将Json字符串转化为对象类型,但是解析往往比较麻烦, Gson是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java ...
  • 使用FastJson解析Json数据

    万次阅读 多人点赞 2015-03-19 14:14:08
    使用Fastjson解析Json数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 767,722
精华内容 307,088
关键字:

解析html数据