`

使用Jsoup抽取数据

阅读更多
Jsoup是一个Java的HTML解析器,提供了非常方便的抽取和操作HTML文档方法,可以结合DOM,CSS和Jquery类似的方法来定位和得到节点的信息。
有着和Jquery一样强大的select和pipeline的API。
我们以从58同城网抽取租房信息为例,来说明如何使用它:
package test

import org.jsoup.nodes.Document
import java.util.HashMap
import org.jsoup.Jsoup
/**
 * Author: fuliang
 * http://fuliang.iteye.com
 */
class HouseEntry(var title: String,var link: String,var price: Integer, var houseType: String, var date: String){
	override def toString(): String = {
		return String.format("title: %s\tlink:%s\tprice:%d\thouseType:%s\tdate:%s\n", title,link,price,houseType,date);
	}
}

class HouseRentCrawler{
	def crawl(url: String,keyword: String,lowRange: Int,highRange: Int): List[HouseEntry] = {
		var doc = fetch(url,keyword,lowRange,highRange);
		return extract(doc);
	}

	private def fetch(url:String,keyword: String,lowRange: Int,highRange: Int): Document = {
		var params = new HashMap[String,String]();
		params.put("final","1");
		params.put("jump","2");
		params.put("searchtype","3");
		params.put("key",keyword);
		params.put("MinPrice",lowRange + "_" + highRange);
		
	    return Jsoup.connect(url).data(params)
									.userAgent("Mozilla")
									.timeout(10000)
									.get();
	}
	
	private def extract(doc: Document):  List[HouseEntry] = {
		val elements = doc.select("#infolist > tr:not(.dev)");
		var houseEntries = List[HouseEntry]();
		for(val i <- 0 until elements.size()){
			val entry = elements.get(i);
			val fields = entry.select("td"); 
			val title = fields.get(0).text();
			val link = fields.get(0).select("a[class=t]").attr("href");
			val price = fields.get(1).text().toInt;
			val houseType = fields.get(2).text();
			val date = fields.get(3).text();
			val houseEntry = new HouseEntry(title,link,price,houseType,date);
			houseEntries ::= houseEntry;
		}
		return houseEntries;
	}
}

object HouseRentCrawler{
	def main(args: Array[String]) {
		val url = "http://bj.58.com/zufang";
		val crawler = new HouseRentCrawler();
		val houseEntries = crawler.crawl(url,"智学苑",2000,3500);
		for(val entry <- houseEntries){
			println(entry);
		}
	}
}

Selector overview

    * tagname: find elements by tag, e.g. a
    * ns|tag: find elements by tag in a namespace, e.g. fb|name finds <fb:name> elements
    * #id: find elements by ID, e.g. #logo
    * .class: find elements by class name, e.g. .masthead
    * [attribute]: elements with attribute, e.g. [href]
    * [^attr]: elements with an attribute name prefix, e.g. [^data-] finds elements with HTML5 dataset attributes
    * [attr=value]: elements with attribute value, e.g. [width=500]
    * [attr^=value], [attr$=value], [attr*=value]: elements with attributes that start with, end with, or contain the value, e.g. [href*=/path/]
    * [attr~=regex]: elements with attribute values that match the regular expression; e.g. img[src~=(?i)\.(png|jpe?g)]
    * *: all elements, e.g. *

Selector combinations

    * el#id: elements with ID, e.g. div#logo
    * el.class: elements with class, e.g. div.masthead
    * el[attr]: elements with attribute, e.g. a[href]
    * Any combination, e.g. a[href].highlight
    * ancestor child: child elements that descend from ancestor, e.g. .body p finds p elements anywhere under a block with class "body"
    * parent > child: child elements that descend directly from parent, e.g. div.content > p finds p elements; and body > * finds the direct children of the body tag
    * siblingA + siblingB: finds sibling B element immediately preceded by sibling A, e.g. div.head + div
    * siblingA ~ siblingX: finds sibling X element preceded by sibling A, e.g. h1 ~ p
    * el, el, el: group multiple selectors, find unique elements that match any of the selectors; e.g. div.masthead, div.logo

Pseudo selectors

    * :lt(n): find elements whose sibling index (i.e. its position in the DOM tree relative to its parent) is less than n; e.g. td:lt(3)
    * :gt(n): find elements whose sibling index is greater than n; e.g. div p:gt(2)
    * :eq(n): find elements whose sibling index is equal to n; e.g. form input:eq(1)
    * :has(seletor): find elements that contain elements matching the selector; e.g. div:has(p)
    * :not(selector): find elements that do not match the selector; e.g. div:not(.logo)
    * :contains(text): find elements that contain the given text. The search is case-insensitive; e.g. p:contains(jsoup)
    * :containsOwn(text): find elements that directly contain the given text
    * :matches(regex): find elements whose text matches the specified regular expression; e.g. div:matches((?i)login)
    * :matchesOwn(regex): find elements whose own text matches the specified regular expression
    * Note that the above indexed pseudo-selectors are 0-based, that is, the first element is at index 0, the second at 1, etc

更多的信息可以参考[http://jsoup.org/|http://jsoup.org/]
分享到:
评论

相关推荐

    使用Jsoup抽取数据.doc

    在本文档中,我们将通过一个实例——从58同城网站抽取租房信息,来深入理解如何使用Jsoup。 首先,我们创建了一个名为`HouseEntry`的类,该类用于存储房屋出租信息,包括标题(title)、链接(link)、价格(price...

    使用JSoup实现新闻网页正文抽取

    总之,使用JSoup实现新闻正文抽取是一个涉及到HTML解析、元素定位、内容提取以及可能的数据持久化的过程。通过熟练掌握JSoup的API,我们可以构建出高效、灵活的新闻爬虫系统,服务于数据分析、信息监控等多种应用...

    jsoup中文帮助文档

    Jsoup 提供 DOM 风格的方法(如 `getElementById()`, `getElementsByTag()`, `select(String cssQuery)` 等)来遍历 Document 对象并抽取所需数据。例如,你可以通过 CSS 选择器选取元素,然后提取它们的属性、文本...

    jsoup中文教程

    解决方法是使用Jsoup提供的方法,如`Jsoup.parse(String html, String baseUri)`来解析HTML字符串,并通过`Document`对象提供的方法来遍历文档和抽取数据。 #### 从URL加载Document Jsoup支持从URL直接加载一个...

    jsoup-annotations是Jsoup注解的POJO

    在Web爬虫开发中,JSoup是一个常用工具,能够高效地从网页中抽取所需信息。 **JSoup-Annotations** JSoup-Annotations是由Francesco Cannizzaro创建的一个项目,它扩展了JSoup的功能,引入了注解来简化HTML解析...

    Jsoup+httpclient 模拟登陆和抓取

    - 主要功能包括从URL、文件或字符串中解析HTML,使用DOM或CSS选择器来查找和抽取数据,以及操作HTML元素、属性、文本。 - Jsoup遵守MIT协议,可以安全地用于商业项目。 2. HttpClient库使用介绍: - HttpClient...

    2010最新解析html开源项目jsoup源码及api下载及jsoup.jar

    1. **数据抓取**:从网页中抽取特定信息,如新闻标题、评论、价格等。 2. **网站自动化**:自动填写表单、点击按钮,实现自动化测试或爬虫。 3. **内容过滤**:清除HTML中的恶意脚本、广告等,提高内容安全性。 4. *...

    Jsoup中文Api.docx

    Jsoup 提供了多种方式来抽取数据,包括 DOM 遍历和选择器语法。选择器语法是一种快速和简洁的方式来选择元素,例如:doc.select("div.myClass") 可以选择所有类名为 myClass 的 div 元素。 5. 设置属性值和元素内容...

    Jsoup解析html中文文档

    使用jsoup进行数据抽取非常便捷,主要包括以下方面: 1. **使用DOM方法遍历Document对象** 2. **使用选择器语法查找元素** 3. **从元素集合抽取属性、文本和HTML内容** 例如,提取文档中所有的链接: ```java ...

    jsoup-1.11.3.jar

    5. **数据提取**:Jsoup支持基于CSS选择器的元素选择,可以方便地抽取网页上的特定信息,如文章标题、作者姓名、评论内容等。此外,还可以使用`Elements`对象的方法来提取元素集合的属性值或文本内容。 6. **表单...

    jsoup-1.8.1.jar

    在实际应用中,jsoup常用于数据抓取和Web爬虫项目,可以方便地抽取特定网站的数据,如新闻标题、评论、商品价格等。同时,它也适用于处理用户提交的HTML内容,确保其安全性。 在【压缩包子文件的文件名称列表】中,...

    jsoup中文API

    4. **数据抽取** - **DOM 遍历**:通过 `doc` 对象,你可以使用 `getElementsByTag()`、`getElementById()`、`select()` 等方法遍历和访问 DOM 树中的元素。 - **选择器语法**:Jsoup 支持 CSS 选择器,允许你像在...

    Jsoup中文API

    以下是对 Jsoup API 的详细解释,涵盖从解析到遍历、数据抽取、修改以及 HTML 清理等多个方面。 1. 解析和遍历一个 HTML 文档: Jsoup 使用内置的 HTML 解析器,能处理不完整的 HTML 结构,例如未闭合的标签。通过...

    Solr~JSOUP.zip

    2. **数据仓库构建**:通过Jsoup抽取大量网站的数据,然后用Solr进行存储和分析,构建一个强大的信息仓库。 3. **智能推荐系统**:利用Solr的搜索能力,结合Jsoup获取的用户行为数据,可以构建个性化的推荐系统。 ...

    jsoup帮助文档

    在本文中,我们将深入探讨 jsoup 的主要功能,包括如何解析和遍历 HTML 文档,抽取数据,修改内容,以及进行 HTML 清理。 首先,jsoup 提供了多种方式来输入 HTML 文档。你可以直接解析一个 HTML 字符串,或者通过 ...

    jsoup-1.14.3-bin.zip

    jsoup广泛应用于各种场景,如网页抓取(爬虫)、网页自动化测试、数据提取、网页内容更新等。例如,开发者可以利用jsoup从电商网站抓取商品信息,从新闻网站提取最新资讯,或者从社交媒体上获取用户数据。 总的来说...

    jsoup网页内容分析

    - **信息提取**:开发者可以利用JSoup从网页中抽取结构化信息,如联系信息、文章摘要等。 - **自动化测试**:在自动化测试场景中,JSoup可以帮助检查网页元素的存在或状态,确保页面渲染正确。 - **内容过滤与清洗**...

    jsoup-1.13.1.jar

    这使得jsoup非常适合用来解析复杂的网页结构,并从中抽取所需的数据。 ##### 2. CSS选择器支持 jsoup 允许使用CSS选择器来查找HTML元素,这种选择方式直观且强大。例如,可以使用 `doc.select("a[href]")` 来获取...

    jsoup Cookbook(中文版).chm

    jsoup Cookbook(中文版) 入门 解析和遍历一个html文档 输入 解析一个html字符串 解析一个body片断 根据一个url加载Document对象 根据一个文件加载Document对象 数据抽取 使用dom方法来遍历一个Document对象 使用选择...

Global site tag (gtag.js) - Google Analytics