Jsoup是一款Java的HTML解析器,可直接解析URL地址 本地的HTML文本文件,它可以自动解析所有超文本标签,提取出这些标签的属性 值,甚至可以遍历子标签。Jsoup的官方网址是https://jsoup.org/,在这里可以下载jsoup.jar文件和阅读相关帮助文档。
使用Jsoup解析一个网页分为两步 第一步是输入,第二部是抽取。
(1 所谓的输入就是捕捉网页超文本,这一步只需要一行代码,例如解析百度首页的代码如下
Document doc = Jsoup.connect("http://www.baidu.com").get();
返回的类型是Jsoup包中提供的org.jsoup.nodes.Document类,该类用于储存HTML超文本。
如果输入的是HTML文本,则代码如下
String html = "<html><head></head><body><p>This is HTML.</p></body></html>";
Document doc = Jsoup.parse(html);
如果输入的是一个HTML文本文件,则需要使用File类,并制定读取的字符编码,代码如下
File input = new File("D:/demo.html");
Document doc = Jsoup.parse(input, "UTF-8");
(2 获得网页超文本之后,第二部就是抽取。抽取超文本数据的方法有很多,例如抽取网址“example.com”的超文本数据的代码如下:
Document doc = Jsoup.connect("example.com").get();
Element users= doc.getElementById("users"); / 获取id='users'的元素
Elements account = users.getElementsByClass("a"); / 获取该集合下class ='a'的元素集合
for (Element info: account ) {
String infoHref = info.attr("href"); / 获取该元素href属性中的值
String infoText = info.text(); / 获取该元素的文本值
}
除了例子中的用法之外,还可以获取以下更多数据
getElementById(String id) 获id=‘id’的元素
getElementsByClass(String className) 获取class=‘className’的元素
getElementsByAttribute(String key) 获取含有key名称属性的元素
attr(String key) 获取属性attr对应的值
attributes() 获取所有属性
id() 获取id的值
className() 获取class的值
and classNames() 获取所有class的值的Set集合
text() 获取文本内容
html() 获取元素内HTML内容
outerHtml() 获取元素外HTML内容
data() 获取数据内容
抽取数据的时候还可以对数据进行筛选,例如
Document doc = Jsoup.connect("example.com").get();
Elements links = doc.select("a[href]"); /带有href属性的a元素
Elements gifs = doc.select("img[src$=.gif]"); / 所有动图的标签
Element masthead = doc.select("div.head").first(); /的div标签
除了例子中的用法之外,Selector选择器还提供以下用法
tagname: 通过标签查找元素,比如 a
ns|tag: 通过标签在命名空间查找元素,比如 可以用 fb|name 语法来查找 <fb:name> 元素
#id: 通过ID查找元素,比如 #username
.class: 通过class名称查找元素,比如 .head
[attribute]: 利用属性查找元素,比如 [href]
[^attr]: 利用属性名前缀来查找元素,比如 可以用[^data-] 来查找带有HTML5 Dataset属性的元素
[attr=value]: 利用属性值来查找元素,比如 [width=200]
[attr^=value], [attr$=value],[attr*=value]: 利用匹配属性值开头、结尾 包含属性值来查找元素,比如 [href*=/mp4/]
[attr =regex]: 利用属性值匹配正则表达式来查找元素,比如 img[src =(?i)\.(png|jpe?g)]
*: 这个符号将匹配所有元素
el#id: 元素+ID,比如 div#images
el.class: 元素+class,比如 div.head
el[attr]: 元素+class,比如 a[href]
任意组合,比如 a[href].login
ancestor child: 查找某个元素下子元素,比如 可以用.body p 查找在"body"元素下的所有 p元素
parent > child: 查找某个父元素下的直接子元素,比如 可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如 div.head + div
siblingA siblingX: 查找A元素之前的同级X元素,比如 h1 p
el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如 div.head, div.videos
看完上面的内容,是不是瞬间感觉Java做数据爬取也这么简单,还不赶紧来试试。喜欢的话,记得点赞+收藏。
Powered by 小羊羔外链网 8.3.11
©2015 - 2024 小羊羔外链网
您的IP:23.22.35.162,2024-04-23 04:45:12,Processed in 0.04474 second(s).