如何将Element从Jsoup保存到数据库

时间:2018-12-19 03:17:49

标签: java database jsoup

我使用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>

2 个答案:

答案 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您的数据。