我使用Jsoup从网站获取所有数据,并在我获取匹配的内容时保存元素。我想要何时获得元素。如果匹配某些东西字符,我从数据库中保存元素(MYSQL,Postgress ...)。我的代码看起来像:
Connection conn = Jsoup.connect("https://viblo.asia");
Document doc = conn.userAgent("Mozilla").get();
Elements elements = doc.getElementsByClass("post-feed").get(0).children();
Elements list = new Elements();
Elements strings = new Elements();
for (Element element : elements) {
if (element.hasClass("post-feed-item")) {
list.add(element);
Element e = element.children().get(1).children().get(1).children().get(0);
if (e.text().matches("^.*?(Docker|docker|DOCKER).*$")) {
strings.add(e);
//save to element to DB
}
}
}
for (Element page : elements) {
if (links.add(URL)) {
//Remove the comment from the line below if you want to see it running on your editor
System.out.println(URL);
}
getPageLinks(page.attr("abs:href"));
}
我想要元素中的标题包含:“ Docker”时,将我的元素保存到数据库中。但在元素中,它包含div和一些东西链接url,img,内容。我如何将其保存到数据库。如果我想将每个元素保存在可行的数据库字段中怎么办?如果没有,我可以将元素转换为html并保存吗?请帮忙。
示例HTML我想保存数据库:
<div class="post-feed-item">
<a href="/u/HoanKi"><img src="https://images.viblo.asia/avatar/1d0e5458-ad41-4d1c-89db-292dc198b4fa.png" srcset="https://images.viblo.asia/avatar/1d0e5458-ad41-4d1c-89db-292dc198b4fa.png 1x, https://images.viblo.asia/avatar-retina/1d0e5458-ad41-4d1c-89db-292dc198b4fa.png 2x" class="avatar avatar--md mr-05"></a>
<div class="post-feed-item__info">
<div class="post-meta--inline">
<div class="user--inline d-inline-flex">
<!---->
<a href="/u/HoanKi" class="mr-05">Hoàn Kì</a>
<!---->
</div>
<div class="post-meta d-inline-flex align-items-center flex-wrap">
<div class="text-muted mr-05">
<span class="mr-05">about 3 hours ago</span>
<button title="Copy URL" class="icon-btn _13z_mK0hRyRB3dPzawysKe_0"><i aria-hidden="true" class="fa fa-link"></i></button>
</div>
<!---->
<!---->
</div>
</div>
<div class="post-title--inline">
<h3 class="word-break mr-05"><a href="/p/docker-chua-biet-gi-den-biet-dung-phan-3-docker-compose-3P0lPm6p5ox" class="link">Docker: Chưa biết gì đến biết dùng (Phần 3 docker-compose )</a></h3>
<div class="tags" data-v-cbe11868>
<a href="/tags/docker" class="el-tag _3wKNDsArij9ZFjXe8k4ryR_0 el-tag--info el-tag--mini" data-v-cbe11868>Docker</a>
</div>
</div>
<!---->
<div class="d-flex justify-content-between">
<div class="d-flex">
<div class="stats">
<span title="Views" class="stats-item text-muted"><i aria-hidden="true" class="stats-item__icon fa fa-eye"></i> 62 </span>
<span title="Clips" class="stats-item text-muted"><i aria-hidden="true" class="stats-item__icon fa fa-paperclip"></i> 1 </span>
<span title="Comments" class="stats-item text-muted"><i aria-hidden="true" class="stats-item__icon fa fa-comments"></i> 0 </span>
</div>
<!---->
</div>
<div title="Score" class="points">
<div class="carets">
<i aria-hidden="true" class="fa fa-caret-up"></i>
<i aria-hidden="true" class="fa fa-caret-down"></i>
</div>
<span class="text-muted">4</span>
</div>
</div>
</div>
</div>
答案 0 :(得分:2)
首先,修改您的逻辑,以便像这样提取post-feed-item
-
Connection conn = Jsoup.connect("https://viblo.asia");
Document doc = conn.userAgent("Mozilla").get();
Elements elements = doc.getElementsByClass("post-feed-item"); //This will get the whole element.
for (Element element : elements) {
String postFeeds = "";
if (element.toString().contains("docker")) {
postFeeds = postFeeds.concat(element.toString());
//save postFeeds to DB
}
}
/**
* Your parsed element may contain single quote (').
* This will cause error while persisting.
* to avoid this you need to escape single quote (')
* with double single quote ('')
*/
if (element.toString().contains("docker")) {
postFeeds = postFeeds.concat(element.toString().replaceAll("'", "''"));
//save postFeeds to DB
}
第二,如果我想将每个元素保存在可行的数据库字段中怎么办?
您不需要单独的列即可将每个元素存储在数据库中。但是,您可以保存,但可行性取决于您的用例。如果您只想存储post-feed-items
只是为了将其写回到您的网页,则不可行。
第三,如何将元素转换为html并保存?
您不需要将element
转换为html
,但是如果要将其保存到数据库,则需要将element
转换为String
。
您只需要一个列类型为 BLOB 的数据类型(您也可以将其另存为 VARCHAR ,但 BLOB 会更安全)。
如何遍历所有页面?
通过查看该页面的源代码,我发现这是获取总页码的方法-
Elements pagination = doc.getElementsByAttributeValueMatching("href", "page=\\d");
int totalPageNo = Integer.parseInt(pagination.get(pagination.size() - 2).text());
然后循环浏览每个页面。
for(int page = 1; page <= totalPageNo; page++) {
Connection conn = Jsoup.connect("https://viblo.asia/?page=" + page);
//rest of your code
}
答案 1 :(得分:0)
我完全知道您的意思。以下是一些观点:
首先,您应该清除搜索内容并在数据库中创建表字段。根据您的想法,您可以在db中创建一个table_docker表,其中包含field_id,field_content,field_start_time,field_links等。
其次,您应该编写一些类的utils,例如作为获取HTML并对其进行解析的JsoupUtils,用于处理html注释并下载这些图片的HtmlUtils,用于连接db和保存数据的DBUtils,用于显示数据的POIUtils,用于处理数据的DataUtils您的数据。