Как сохранить элемент из Jsoup в базу данных - PullRequest
0 голосов
/ 19 декабря 2018

Я использую 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, content.Как сохранить его в базе данных.Что если я захочу сохранить каждый элемент в поле базы данных, если это возможно?Если нет, я могу преобразовать элемент в 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 голосов
/ 19 декабря 2018

Во-первых, измените свою логику для выборки 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
}
0 голосов
/ 19 декабря 2018

Я правильно знаю, что вы имеете в виду. Вот несколько мнений:
Сначала вы должны уточнить, что вы ищете, и заполнить поля таблиц в базе данных.Например, в соответствии с вашими идеями, вы можете сделать таблицу table_docker в db, и в ней есть field_id, field_content, field_start_time, field_links и т. Д.получить HTML и проанализировать его, HtmlUtils, который используется для обработки html-замечаний и загрузки этих изображений, DBUtils, который используется для подключения БД и сохранения данных, POIUtils, который используется для отображения ваших данных, DataUtils, который используется для обработки ваших данных.по твоим путям.

...