用jsoup解析获取一段网页内容的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用jsoup解析获取一段网页内容的问题相关的知识,希望对你有一定的参考价值。

html实例:
-----------------------------------------------------------
<div class="list_books" id="list_books">
<td>java开发解析</td>
<p><span><strong>馆藏复本:</strong>3 <br />
<strong>可借复本:</strong>0 </span>
朱印宏编著 <br /> 长江出版社</p>
</div>
-------------------------------------------------------------
这段网页,获取图书标题信息代码如下。
-------------------------------------------------------------
Java代码:
Book book=new Book();
book.setTitle(book..get(0).getElementsByTag("td").text());
--------------------------------------------------------------
但是怎么获取“作者”、“出版社信息”、“管藏复本”、“可借复本”信息?
没有标签或者class和id什么的,困惑。。。。
上面的java代码写错了:

Java代码:
Elements es=doc.getElementsByClass("list_books");
Book book=new Book();
book.setTitle(es..get(0).getElementsByTag("td").text());

这段html实际上是不符合规范的。在用jsoup解析时会出现问题。

我想到一个办法解决这个问题。

首先我想你应该是想得到 标题、馆藏复本的数目、可借复本的数目、朱印宏编著和长江出版社。 


所以我们先把上面html里面的文字全部得到即:

java开发解析 馆藏复本:3 可借复本:0 朱印宏编著 长江出版社


然后我想在这段文字中 “馆藏复本:”、“可借复本:”、“编著” 这几个字应该是固定不变的。所以我们可以用正则表达式去对它进行解析,得到你想要的文字。

代码如下:

public class Test 


public static void main(String[] args) 

String html = "<div class=\\"list_books\\" id=\\"list_books\\"><td>java开发解析</td><p><span><strong>馆藏复本:</strong>3 <br /> <strong>可借复本:</strong>0 </span>朱印宏编著 <br /> 长江出版社</p> </div>";
Document doc = Jsoup.parse(html);
String e = doc.select("#list_books").text().replaceAll("[\\\\s]+", "");
//System.out.println(e);
Pattern p = Pattern.compile("^(.*)馆藏复本:([\\\\d]+)可借复本:([\\\\d]+)(.*)编著(.*)$");
Matcher m = p.matcher(e);
if(m.find())
for(int i=1;i<=m.groupCount();i++)
System.out.println(m.group(i));





如果如下:

java开发解析
3
0
朱印宏
长江出版社

参考技术A 首先

Elements es = doc.select("div.list_books>p");//用Jsoup可以直接用它的selector,选标签很方便,此处表达式的意思是选中class名字为list_books的div标签下的直接子标签p,更多丰富的表达式用法你可以访问Jsoup的Api文档查询。百度不允许粘贴URL,所以你只要自己搜索一下。
然后

List[Node] ls = es.childNodes ;//具体方法名字是不是这个我搞忘了,但是对于elements对象有一个方法,就是得到它的所有子节点,以list的形式返回;这里你不要觉得纯文本没有标签就选不到,其实不论是纯文本还是html标签在document里都是一个节点对象,只是不同类型的,纯文本叫textNode,标签叫element。
循环遍历这个list,用isInstanceOf方法找出textNode 第一个textNode就是作者,第二个TextNode就是出版社
参考技术B 人生追求的梦想其实有很多,贪婪财富让人的欲望极度膨胀,致使许多的人前赴后继的坠入这个行业的陷阱,甚至有些人失去理性,抛弃爱人、恋人和家庭,不惜与亲友决裂。最终得到的结果却失去人生之中最珍贵美好的情感和诚信,这就是冲动的代价。

在行业里过年是最让人痛苦的,当初的雄心勃勃,豪言壮志已化为泪水,“无颜再见江东父老”。可曾想过家里等候你们的父母、爱人,孩子那充满了期盼的眼神。

想想在“行业”里奋斗的经历,你们也是为了家庭的幸福,为了报答双亲让你们过上富裕的生活。其实父母希望的是儿女健康平安,金钱替代不了幸福快乐。

当你们深陷这个行业谎言中时,亲友泣如雨下悲痛欲绝,人生之中最大的痛苦,莫过于眼睁睁的看着最亲最爱的人一步步的陷入深渊,而站在身旁的自己却无能为力。

一年又一年,行业里来来走走人很多,唯一不变的就是谎言。每天打开电脑,总是有这个行业新闻,多么希望有一天它彻底灭绝,国人能幸福和谐的生活。

转眼之间六个春秋,我依然在反传的道路上前行,人生的旅途中过客匆忙,早已忘却了容颜。那些脱离行业的人已经开始新的生活,而深陷行业的却深信前人留下来的一个又一个美丽的谎言。

奉劝那些还在行业谎言里苦苦“奋斗”的人,梦终归要醒来,那时亲情、诚信将毁于一旦,苦涩悔恨的泪水将伴随一生,悬崖勒马,早日清醒尽快回家过年吧!莫让亲人再担心牵挂。

模式是好的,但并不适合每个人去从事。不要冲动啊,只知道好的,负面的你们永远都看不到,世上就没有那么完美的事!
回家吧!该是合家团聚的时候,不要再让你的家人和朋友担惊受怕,遭受全家离散之苦了,他们等待得太久,已经哭干眼泪,望穿秋水,不要再让他们遭受折磨和煎熬了。难咽的大锅饭,哪里有家里的好酒好菜有滋有味呢?

回家吧!放弃那遥不可及的梦想,放弃那充满谎言又见不得阳光的生活,下定决心,马上收拾行囊,踏上列车,回家的路其实很短!

回家吧!该是回家团聚的时候,出门在外的朋友,你们的亲人,你们的恋人,你们的朋友期待着你踏回回家之路。

请记住,真正拯救你的人是你自己!

JSoup——用Java解析html网页内容

当需要从网页上获取信息时,需要解析html页面。筛选指定标签,并获取其值是必不可少的操作,解析html页面这方面的利器,Python有BeautifulSoup,Java一直没有好的工具,之前的HtmlParser非常难用,虽能解析,但不能过滤,只能从头到尾地遍历各个节点,非常不便,而Jsoup是甚至比BeautifulSoup更加方便的工具,Jsoup支持类似于CSS(或jquery)的选择器语法,来实现非常强大和灵活的查找功能。

下面说说其基本用法:

1)Jsoup.parse(html)//建立一个html文本指定的html文档,返回一个Document对象

2)Document.select(filter)//按照过滤器指定条件,筛选满足条件的所有元素(或称为标签),返回一个Elements对象,表示一组Element对象。

3)Elements.first()//返回Elements的第一个Element对象

4)Element.text()//获取一个标签首尾之间的内容,如
String html="<div>我是一个div</div>";
Document doc=Jsoup.parse(html);
doc.getElementsByTag("div").first().text();//输出"我是一个div"

5)Element.attr(attrname),获取标签某个属性的值,如
String html="<div>我是一个div</div>";
Document doc=Jsoup.parse(html);
doc.getElementsByTag("div").first().attr("class")的值为"divStyle"


给出一个综合示例:

public static HashMap<String, Object> getDetails(String html)
    {
        HashMap<String, Object> details = new HashMap<String, Object>();
     //解析开始
        Document doc = Jsoup.parse(html);
     //获取形如<div class="result_info ...">something</div>的第一个div元素,class^=result_info表示class以result_info开头,^是正则表达式的开始
     Element divAll = doc.select("div[class^=result_info]").first();
     
        //System.out.println(divAll.text());
        Element head = divAll.select("h3").first();//获取div中的h3标签
        String tvname = head.select("a").attr("title").trim();//获取h3标签中a标签的title属性值
        String year = "";
        if (head.select("em").size() > 0)//假如h3标签中存在多个<em></em>标签
        {
            year = head.select("em").first().text().trim();//只要第一个<em>首尾之间的文本
        }
        String score = "";
        Element scoreSection = divAll.select("p").first();
        if (scoreSection != null)
        {
            Elements es = scoreSection.select("span");//选择span元素
            int size = es.size();
            for (int i = 0; i < size; i++)
            {
                Element e = es.get(i);
                String content = e.text().trim();
                content = content.replace("\u00A0", "");//替换&nbsp;为空格
                score += content;
            }
        }
        HashMap<String, String> lstOtherInfo = new HashMap<String, String>();
        Elements otherSections = divAll.select("div[class^=result_info_cont]");//获取满足class以result_info_cont开头的所有div元素
        int size = otherSections.size();//获取满足条件的div元素的总数是多少
        int infoCount = 0;
        for (int i = 0; i < size && infoCount < 3; i++)
        {
            String value = "";
            Element item = otherSections.get(i);//获取第i个元素
            boolean keyflag = true;
            String key = "";
            for (int index = 0; index < item.children().size(); index++)//Element.children()用于获取元素的直接子元素
            {
                Element e = item.child(index);//获取第index个子元素
                if (keyflag)
                {
                    key = e.text().trim();
                    if (key == "简介")
                        break;
                    keyflag = false;
                }
                else
                {
                    if (e.children().size() > 0)
                    {
                        for (int b = 0; b < e.children().size(); b++)
                        {
                            value += e.child(b).text().trim() + ",";
                        }
                    }
                    else
                    {
                        String contents = e.text().trim();
                        value += contents + ",";
                    }
                }
            }
            value = value.replaceAll("[" + "," + "]$", "");
            lstOtherInfo.put(key, value);
            infoCount++;
        }
        details.put("tv", tvname);
        details.put("year", year);
        details.put("score", score);
        details.put("otherInfo", lstOtherInfo);
        return details;
    }

参考链接:

http://jsoup.org/apidocs/

https://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/

http://www.open-open.com/jsoup/selector-syntax.htm

 

以上是关于用jsoup解析获取一段网页内容的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用Jsoup获取网页内容超时设置

jsoup教程

jsoup入门

jsoup入门

jsoup教程

使用Jsoup和htmlunit爬取动态网页