Java上的jQuery?解析HTML利器—Jsoup

发表于:2016-8-10 10:02

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:吴纹羽    来源:51Testing软件测试网采编

  也许大家有过在java运行平台上解析html的经历,通常的方式是将HTML以XML的形式进行结点解析,调用java本身的xml解析类库。这样的方式很容易理解并且很方便,但习惯用jQuery的各位是否在感叹能否在java中像jQuery一样获取标签内容,实现DOM操作呢?终于,发现了一个html解析利器,jsoup!
  初次用jsoup的时候是在业余时间做一款漫画下载器的时候发现的,做漫画下载器时,因无法得到网站的API接口,所以只能通过解析HTML的方式获得网页内容与图片,在网络上找到jsoup以后发现习惯于jquery方式编程的我很快就可以适应jsoup的选择器,得到内容的方式也很容易,下面我们就开始学习神奇的jsoup。
  1.下载jsoup
  大家可以去jsoup的官网下载jsoup,或者点击jsoup-1.7.3.jar(官方下载地址)
  2.jsoup初体验
  第一步   获取html文档对象。
  Document对象:用于接收html的文档内容
  Jsoup.connect(String url).get():用于指定网址,返回值为Document对象
  ps:如果需要解析访问较慢的网站的话需要加上timeout方法,以放抛出RuntimeException异常。
  //文档对象,用来接收html页面
  Document document = null;
  try {
  //获取指定网址的页面内容
  document = Jsoup.connect("http://www.baidu.com/").timeout(50000).get();
  } catch (IOException e) {
  e.printStackTrace();
  }
  另外我们除了通过网址的到HTML文档对象外还可以通过读取HTML文件来获取HTML文档,方法如下:
  //获得文件对象
  File input = new File("/tmp/input.html");
  //获得文档对象
  Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
  上面这段代码很好理解,parse是Jsoup类的静态方法,用于加载和解析HTML文档,其中的三个参数分别为:
  参数1:要获取的文件对象
  参数2:HTML文档的文字编码例如UTF-8,ISO 8859-1,GBK等等
  参数3:用于相对路径的前缀
  第二步   通过选择器得到想要的Dom结点
  jsoup提供了丰富的选择器,选择器的方便程度媲美jQuery,其中的筛选选择器,父选择器等更是jQuery上本身就拥有的,具体该怎么用这个选择器呢?相信习惯jQuery的童鞋很快就会适应jsoup选择器的。
  首先我们需要认识一下Elements对象,Elements类实现了java.lang.List接口,主要用于保存选择器选择到的结点。
  接下来我们来看一下Document对象获取结点的步骤:
  //通过Document的select方法获取class为abc的Elements结点集合
  Elements elements = document.select(".abc");
  //得到结点的第一个对象
  Element element = elements.get(0);
  //获取想要的属性值
  String href = element.attr("href");
  共三步,就可以得到想要的结果了,是不是很方便呢?
  并且第二个步骤是可以省略的,下面让我们来看一下Elements的attr()方法的源码
/**
Get an attribute value from the first matched element that has the attribute.
@param attributeKey The attribute key.
@return The attribute value from the first matched element that has the attribute.. If no elements were matched (isEmpty() ==      true),
or if the no elements have the attribute, returns empty string.
@see #hasAttr(String)
*/
public String attr(String attributeKey) {
for (Element element : contents) {
if (element.hasAttr(attributeKey))
return element.attr(attributeKey);
}
return "";
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号