# jsouplib
**Repository Path**: zdong_coding/jsouplib
## Basic Information
- **Project Name**: jsouplib
- **Description**: 使用jsoup 自动解析成 bean
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-05-24
- **Last Updated**: 2021-06-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AJsoup
[](https://www.android.com)
[](https://android-arsenal.com/api?level=14)
[](https://github.com/zdongcoding)
> AJsoup 模块是快速将html 转换成bean 类似gson转换
> 依赖 [jsoup](https://github.com/jhy/jsoup)
> **使用前提你了解jsoup并且了解[jsoup的Select](https://jsoup.org/apidocs/index.html?org/jsoup/select/Selector.html)**
**Gradle**
> compile 'com.github.zdongcoding:ajsoup:0.1.0'
**Maven**
```
com.github.zdongcoding
ajsoup
0.1.0
pom
```
使用方法如下:
```
bean.java
@Select(select = "body")
public class HomeBean {
@Select(select = "div > div > div.listbox")
public HotTopTabBean hotTopTabBean; //热门数据
@Select(select = "div#nav > ul > li[id]", attr = "id")
public Map navBeans;
@Select(select = "div#nav-under > ul >li:has(a)") //排除无 navUnderBeans;
@Select(select = "div#body > div.left.noborder.clearfix.block1 > ul")
public List latests;
@Select(select = "div#header-in > div > ul#hot-words > li")
public List searchbeans;
}
String html=....;
HomeBean bean=AJsoupReader.deserialize(Jsoup.parse(html), HomeBean.class);
```
# AJsoup---->Converter-Ajsoup
> 使用过Retrofit 一看这个名字就知道做什么的
**Gradle**
> compile 'com.github.zdongcoding:converter-ajsoup:0.1.0'
**Maven**
```
com.github.zdongcoding
converter-ajsoup
0.1.0
pom
```
使用方法:
```
Api.java
public interface Api {
@GET("{url}")
Observable getPage(@Path(value = "url",encoded = true) String url);
}
api = new Retrofit.Builder().baseUrl(baseUri)
.addConverterFactory(JsoupConverterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build().create(Api.class);
api.getPage("").subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(HomeBean homeBean) {
view.setText(homeBean.toString());
}
});
```
选择器概要(Selector overview)
* Tagname:通过标签查找元素(例如:a)
* ns|tag:通过标签在命名空间查找元素,例如:fb|name查找元素
* #id:通过ID查找元素,例如#logo
* .class:通过类型名称查找元素,例如.masthead
* [attribute]:带有属性的元素,例如[href]
* [^attr]:带有名称前缀的元素,例如[^data-]查找HTML5带有数据集(dataset)属性的元素
* [attr=value]:带有属性值的元素,例如[width=500]
* [attr^=value],[attr$=value],[attr*=value]:包含属性且其值以value开头、结尾或包含value的元素,例* 如[href*=/path/]
* [attr~=regex]:属性值满足正则表达式的元素,例如img[src~=(?i)\.(png|jpe?g)]
* *:所有元素,例如*
* 选择器组合方法
* el#id::带有ID的元素ID,例如div#logo
* el.class:带类型的元素,例如. div.masthead
* el[attr]:包含属性的元素,例如a[href]
* 任意组合:例如a[href].highlight
* ancestor child:继承自某祖(父)元素的子元素,例如.body p查找“body”块下的p元素
* parent > child:直接为父元素后代的子元素,例如: div.content > pf查找p元素,body > * 查找body元素的* 直系子元素
* siblingA + siblingB:查找由同级元素A前导的同级元素,例如div.head + div
* siblingA ~ siblingX:查找同级元素A前导的同级元素X例如h1 ~ p
* el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如div.masthead, div.logo
* 伪选择器(Pseudo selectors)
* :lt(n):查找索引值(即DOM树中相对于其父元素的位置)小于n的同级元素,例如td:lt(3)
* :gt(n):查找查找索引值大于n的同级元素,例如div p:gt(2)
* :eq(n) :查找索引值等于n的同级元素,例如form input:eq(1)
* :has(seletor):查找匹配选择器包含元素的元素,例如div:has(p)
* :not(selector):查找不匹配选择器的元素,例如div:not(.logo)
* :contains(text):查找包含给定文本的元素,大小写铭感,例如p:contains(jsoup)
* :containsOwn(text):查找直接包含给定文本的元素
* :matches(regex):查找其文本匹配指定的正则表达式的元素,例如div:matches((?i)login)
* :matchesOwn(regex):查找其自身文本匹配指定的正则表达式的元素
* 注意:上述伪选择器是0-基数的,亦即第一个元素索引值为0,第二个元素index为1等
主要用到以上字段
**不需要服务器 就可以做一个快速做一个客户端**
完毕,就是这么简单