- 浏览: 1653546 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
Jsoup是一个Java的HTML解析器,提供了非常方便的抽取和操作HTML文档方法,可以结合DOM,CSS和Jquery类似的方法来定位和得到节点的信息。
有着和Jquery一样强大的select和pipeline的API。
我们以从58同城网抽取租房信息为例,来说明如何使用它:
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/]
有着和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/]
发表评论
-
Lucene 索引格式
2013-06-25 20:11 0索引结构: 索引层次 ... -
计算广告学
2012-08-12 13:53 0计算广告学一: 1、核 ... -
《Lucene in Action》简单笔记
2011-12-22 09:19 0第一章 Meet Lucene -
Information Retrieval Resources
2011-04-07 16:40 1388Information Retrieval Resource ... -
常见文件类型识别
2010-09-22 20:09 11879根据文件的后缀名识别文件类型并不准确,可以使用文件的头信息进行 ... -
(zz)信息检索领域资料整理
2010-06-05 13:05 3171A Guide to Information Retrieva ... -
Introduce to Inforamtion Retrieval读书笔记(2)
2009-10-31 13:02 1934The term vocabulary and posting ... -
Introduce to Inforamtion Retrieval读书笔记(1)
2009-10-25 23:49 2052很好的一本书,介绍的非常全面,看了很久了,还没有看完,刚看完前 ... -
Query Log Mining notes
2009-10-02 18:08 1272Enhancing Efficiency of Search ... -
百度搜索的一些高级语法
2009-08-27 20:06 19321.title语法 就是在title ... -
Hadoop好书推荐:Hadoop The Definitive Guide
2009-08-16 22:49 3639第一本详细介绍Hadoop的书籍,从网上下来看了几章,作者是H ... -
Java开源搜索引擎[收藏]
2008-04-24 00:09 2903Egothor Egothor是一个用Java编写的开 ... -
分享一本斯坦福的信息检索的教材
2008-01-04 23:59 2462斯坦福的信息检索的教材,还没出版,先分享一下电子版原稿. 对于 ... -
分享一本搜索引擎的电子书
2007-12-29 19:42 2530还没有来得及看,但搜索引擎的书不是很好找,先放上,希望对大家能 ... -
分享一个Nutch入门学习的资料
2007-12-18 20:49 4266分享一个Nutch入门学习的资料,感觉写的还不错. -
搜索引擎Nutch源代码研究之一 网页抓取(4)
2007-12-17 22:37 8396今天来看看Nutch如何Parse网页的: Nutch使用了两 ... -
[转]MAP/REDUCE:Google和Nutch实现异同及其他
2007-12-15 19:21 2997设计要素 nutch包含以下几个部分: 辅助类 Log:记载运 ... -
Nutch源代码学习小小总结一下
2007-12-15 19:13 4466我现在看得源码主要是网页抓取部分,这部分相对比较容易。我首先定 ... -
搜索引擎Nutch源代码研究之一 网页抓取(3)
2007-12-15 16:39 4586今天我们看看Nutch网页抓取,所用的几种数据结构: 主要涉及 ... -
搜索引擎Nutch源代码研究之一 网页抓取(2)
2007-12-15 00:36 5564今天我们来看看Nutch的源代码中的protocol-h ...
相关推荐
在本文档中,我们将通过一个实例——从58同城网站抽取租房信息,来深入理解如何使用Jsoup。 首先,我们创建了一个名为`HouseEntry`的类,该类用于存储房屋出租信息,包括标题(title)、链接(link)、价格(price...
总之,使用JSoup实现新闻正文抽取是一个涉及到HTML解析、元素定位、内容提取以及可能的数据持久化的过程。通过熟练掌握JSoup的API,我们可以构建出高效、灵活的新闻爬虫系统,服务于数据分析、信息监控等多种应用...
Jsoup 提供 DOM 风格的方法(如 `getElementById()`, `getElementsByTag()`, `select(String cssQuery)` 等)来遍历 Document 对象并抽取所需数据。例如,你可以通过 CSS 选择器选取元素,然后提取它们的属性、文本...
解决方法是使用Jsoup提供的方法,如`Jsoup.parse(String html, String baseUri)`来解析HTML字符串,并通过`Document`对象提供的方法来遍历文档和抽取数据。 #### 从URL加载Document Jsoup支持从URL直接加载一个...
在Web爬虫开发中,JSoup是一个常用工具,能够高效地从网页中抽取所需信息。 **JSoup-Annotations** JSoup-Annotations是由Francesco Cannizzaro创建的一个项目,它扩展了JSoup的功能,引入了注解来简化HTML解析...
- 主要功能包括从URL、文件或字符串中解析HTML,使用DOM或CSS选择器来查找和抽取数据,以及操作HTML元素、属性、文本。 - Jsoup遵守MIT协议,可以安全地用于商业项目。 2. HttpClient库使用介绍: - HttpClient...
1. **数据抓取**:从网页中抽取特定信息,如新闻标题、评论、价格等。 2. **网站自动化**:自动填写表单、点击按钮,实现自动化测试或爬虫。 3. **内容过滤**:清除HTML中的恶意脚本、广告等,提高内容安全性。 4. *...
Jsoup 提供了多种方式来抽取数据,包括 DOM 遍历和选择器语法。选择器语法是一种快速和简洁的方式来选择元素,例如:doc.select("div.myClass") 可以选择所有类名为 myClass 的 div 元素。 5. 设置属性值和元素内容...
使用jsoup进行数据抽取非常便捷,主要包括以下方面: 1. **使用DOM方法遍历Document对象** 2. **使用选择器语法查找元素** 3. **从元素集合抽取属性、文本和HTML内容** 例如,提取文档中所有的链接: ```java ...
5. **数据提取**:Jsoup支持基于CSS选择器的元素选择,可以方便地抽取网页上的特定信息,如文章标题、作者姓名、评论内容等。此外,还可以使用`Elements`对象的方法来提取元素集合的属性值或文本内容。 6. **表单...
在实际应用中,jsoup常用于数据抓取和Web爬虫项目,可以方便地抽取特定网站的数据,如新闻标题、评论、商品价格等。同时,它也适用于处理用户提交的HTML内容,确保其安全性。 在【压缩包子文件的文件名称列表】中,...
4. **数据抽取** - **DOM 遍历**:通过 `doc` 对象,你可以使用 `getElementsByTag()`、`getElementById()`、`select()` 等方法遍历和访问 DOM 树中的元素。 - **选择器语法**:Jsoup 支持 CSS 选择器,允许你像在...
以下是对 Jsoup API 的详细解释,涵盖从解析到遍历、数据抽取、修改以及 HTML 清理等多个方面。 1. 解析和遍历一个 HTML 文档: Jsoup 使用内置的 HTML 解析器,能处理不完整的 HTML 结构,例如未闭合的标签。通过...
2. **数据仓库构建**:通过Jsoup抽取大量网站的数据,然后用Solr进行存储和分析,构建一个强大的信息仓库。 3. **智能推荐系统**:利用Solr的搜索能力,结合Jsoup获取的用户行为数据,可以构建个性化的推荐系统。 ...
在本文中,我们将深入探讨 jsoup 的主要功能,包括如何解析和遍历 HTML 文档,抽取数据,修改内容,以及进行 HTML 清理。 首先,jsoup 提供了多种方式来输入 HTML 文档。你可以直接解析一个 HTML 字符串,或者通过 ...
jsoup广泛应用于各种场景,如网页抓取(爬虫)、网页自动化测试、数据提取、网页内容更新等。例如,开发者可以利用jsoup从电商网站抓取商品信息,从新闻网站提取最新资讯,或者从社交媒体上获取用户数据。 总的来说...
- **信息提取**:开发者可以利用JSoup从网页中抽取结构化信息,如联系信息、文章摘要等。 - **自动化测试**:在自动化测试场景中,JSoup可以帮助检查网页元素的存在或状态,确保页面渲染正确。 - **内容过滤与清洗**...
这使得jsoup非常适合用来解析复杂的网页结构,并从中抽取所需的数据。 ##### 2. CSS选择器支持 jsoup 允许使用CSS选择器来查找HTML元素,这种选择方式直观且强大。例如,可以使用 `doc.select("a[href]")` 来获取...
jsoup Cookbook(中文版) 入门 解析和遍历一个html文档 输入 解析一个html字符串 解析一个body片断 根据一个url加载Document对象 根据一个文件加载Document对象 数据抽取 使用dom方法来遍历一个Document对象 使用选择...