select详解
Document 继承自 Element 类。select方法将返回一个Elements集合。
1.通过标签名来查找:
测试代码:
<span>33</span>
<span>25</span>
select写法:Elements elements = document.select("span");
下面的例子都按照上面的格式来写,就不进行重复的标注了。
2.通过id来查找:
<span id=\"mySpan\">36</span>
<span>20</span>
select写法: Elements elements = document.select("#mySpan");
//通过id来查找,使用方法跟css指定元素一样,用#
3.通过class名来查找:
<span class="myClass">36</span>
<span>20</span>
select写法:Elements elements = document.select(".myClass");
//使用方法跟css指定元素一样,用.
4.利用标签内属性名查找元素:
<span class="class1" id="id1">36</span>
<span class="class2" id="id2">36</span>
select写法:Elements elements = document.select("span[class=class1]span[id=id1]");
//规则为 标签名【属性名=属性值】,多个属性即多个【】,如上
5.利用标签内属性名前缀查找元素:
<span class="class1" >36</span>
<span class="class2" >22</span>
select写法:Elements elements = document.select("span[^cl]");
//规则为 标签名【^属性名前缀】,多个属性即多个【】
6.利用标签内属性名+正则表达式查找元素
对正则表达式不了解的同学下去一定要学习正则表达式哦,因为它在爬虫中可是很重要的。
<span class="ABC" >36</span>
<span class="ADE" >22</span>
select写法:Elements elements = document.select("span[class~=^AB]");
//规则为 标签名【属性名~=正则表达式】,以上的正则表达式的意思是查找class值以AB为开头的标签
7.利用标签文本包含某些内容来查找:
<span>36</span>
<span>22</span>
select写法:Elements elements = document.select("span:contains(3)");
//规则为 标签名:contains(文本值)
8.利用标签文本包含某些内容+正则表达式来查找:
<span>36</span>
<span>22</span>
select写法:Elements elements = document.select("span:matchesOwn(^3)");
//规则为 标签名:matchesOwn(正则表达式),以上的正则表式的意思是以文本值以3为开头的标签
当然select还有其他强大的功能,如果对select感兴趣的同学可以查看select API,我只是列出了获取网页特定内容所需要的select的基本语法,基本上对于大部分的爬虫需求来说已经足够了。
# 下来给大家展示一个使用select获取特定元素值的代码:
public class SelectDemo {
public static void test(String html) {
//采用Jsoup解析
Document doc = Jsoup.parse(html);
//System.out.println(html);
//获取html标签中的内容
Elements elements = doc.select("ul[class=gl-warp clearfix]")
.select("li[class=gl-item]");
for (Element ele : elements) {
String JdbookID = ele.attr("data-sku");
//out.println(JdbookID);
}
}
}
上面的代码是我爬京东图书提取图书的id的部分截取,可以看到select的用法与前面讲的没有什么区别。对于Element 这个类来说,如果我们要获取一个标签中的属性值或文本内容可以这样来做:
for (Element ele : elements) {
String JdbookID = ele.attr("data-sku"); //获取data-sku的属性值
//out.println(JdbookID);
String text = ele.text(); //获取当前标签(元素)的文本值
//out.println(text);
}
9.获取table的下级tr标签数据
例:获取主tr
<tbody id="js_video_container">
<tr>
<td>1</td>
<td>张三</td>
<td>17</td>
<td>山东</td>
<td>邮箱</td>
</tr>
<tr>
<td>2</td>
<td>李四</td>
<td>18</td>
<td>哈尔滨</td>
<td>邮箱</td>
</tr>
<tr>
<td>3</td>
<td>王五</td>
<td>19</td>
<td>北京</td>
<td>
<tbody id="js_video_container">
<tr>
<td>One</td>
<td>南北</td>
</tr>
</tbody>
</td>
</tr>
</tbody>
实现
Elements rows = doc.select("tbody[id='js_video_container']>tr");
10.通过标签名来移除:
测试代码:
<tr>
<td>1</td>
<td>小鸟的昵称</td>
<td>达人简介...</td>
<td>
<div class="sp-words">
<em>标签one</em>
<em>标签two</em>
<em>标签内容
<div>
<p>弹出层消息框!</p>
</div>
</em>
</div>
</td>
</tr>
select写法:
Elements elements = document.select("tr");
for (int i=0; i<elements.size(); i++) {
Elements tdList = elements.get(i).select("td");
for (int m=0; m<tdList.size(); m++) {
switch(m) {
case 0:
tdList.get(m).select("div[class='sp-words']>em").select("div").remove();
case 1:
...
}
}
}
11.通过标签下标选择:
测试代码:
<div>
<a href="www.baidu.com">baidu</a>
<a href="fanyi.baidu.com">fanyi</a>
</div>
select写法:
Elements elements = document.select("div>a").eq(1).text();
---------------------------------Result---------------------------------------------
:fanyi
上面的代码实现div标签下重复多个a标签的情况根据位数选择标签对象