gpt4 book ai didi

java - 如何将Jsoup中的Element保存到数据库

转载 作者:行者123 更新时间:2023-12-02 01:44:50 25 4
gpt4 key购买 nike

我使用 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”,它将我的元素保存到数据库。但在 element 中,它包含 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>

最佳答案

首先,修改您的获取 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 以便将其写回到您的网页,那么这是不可行的。

第三,如何将element转换为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
}

关于java - 如何将Jsoup中的Element保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53844099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com