Optional的私人使用技巧(一)
作者:互联网
抛砖引玉
1、爬虫时遇到html页面
演示时我截取有这么一段表单(该页面只有一个表单),当然我已经把关键字段给xxx了
需要获取表单的所有input域的name和value,并返回一个Map<String,Object>
<body>
<form style="margin: 0px; padding: 0px;" method="post"
action="XXX" id="pform" name="pform">
<input type="hidden" name="part1" value="1"/>
<input type="hidden" name="part2" value="2"/>
<input type="hidden" name="part3" value="3"/>
<input type="hidden" name="part4" value="null"/>
<input type="hidden" name="part5" value="null"/>
<input type="hidden" name="part6" value="1"/>
<input type="hidden" name="part7" value="2"/>
<input type="hidden" name="part8" value=""/>
<input type="hidden" name="part9" value="null"/>
<input type="hidden" name="part10" value=""/>
</form>
</body>
2、开始动手,使用Jsoup解析
直接上代码,这个就是一堆doc操作而已,是吧,,不难。
public static Map<String, Object> formFirst(Document document) {
Map<String, Object> params = new HashMap<>();
//当然也可以根据id
FormElement formElement = document.body().children().forms().get(0);
formElement.formData().forEach(e->params.put(e.key(),e.value()));
return params;
}
问题在哪呢?如果某一天这个页面真的被后台改造了,那么这段代码就会出问题,抛出NPE。
3、使用Optional<>
public static Map<String, Object> formFirst(Document document) {
Map<String, Object> params = new HashMap<>();
Optional.ofNullable(document.body())
//.flatMap(e -> Optional.ofNullable(e.children())) //flatMap要求传入non null
//.flatMap(e -> Optional.ofNullable(e.forms()))
.map(Element::children)
.map(Elements::forms)
.filter(e -> e.size() > 0)
.map(e -> e.get(0))
.ifPresent(e -> e.formData().forEach(e2 -> params.put(e2.key(), e2.value())));
if (params.isEmpty()) {
logger.warn("can't get params corrently of the giving html");
}
return params;
}
简单易用,可以自己尝试下。
Optional非常适合在解析某些格式的文件或者对象,比如xml,html亦或是http交互的对象,因为不确定是否拥有我想要的域,所有不断抽丝剥茧拿到想要的。
标签:Map,私人,技巧,html,params,document,Optional,页面 来源: https://blog.csdn.net/sawiii/article/details/103934494