您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java怎么解析html中的內(nèi)容并存到數(shù)據(jù)庫”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java怎么解析html中的內(nèi)容并存到數(shù)據(jù)庫”吧!
我選用的是使用jsoup進(jìn)行html的讀取和解析,需要加入如下依賴:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.3</version> </dependency>
jsoup 是一款 Java 的HTML 解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jquery的操作方法來取出和操作數(shù)據(jù)。它是基于MIT協(xié)議發(fā)布的。
jsoup的主要功能如下:
1、從一個(gè)URL,文件或字符串中解析HTML;
2、使用DOM或CSS選擇器來查找、取出數(shù)據(jù);
3、可操作HTML元素、屬性、文本;
示例代碼:
//獲取html的文檔對象 Document doc = Jsoup.parse("http://www.dangdang.com"); //獲取頁面下id="content"的標(biāo)簽 Element content = doc.getElementById("content"); //獲取頁面下的a標(biāo)簽 Elements links = content.getElementsByTag("a"); for (Element link : links) { //獲取a標(biāo)簽下的href的屬性值 String linkHref = link.attr("href"); //獲取a標(biāo)簽下的文本內(nèi)容 String linkText = link.text(); }
Elements這個(gè)對象提供了一系列類似于DOM的方法來查找元素,抽取并處理其中的數(shù)據(jù)。具體如下:
1、查找元素
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods)
Element siblings: siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()
Graph: parent(), children(), child(int index)
2、元素?cái)?shù)據(jù)
attr(String key)獲取屬性
attr(String key, String value)設(shè)置屬性
attributes()獲取所有屬性
id(), className() and classNames()
text()獲取文本內(nèi)容
text(String value) 設(shè)置文本內(nèi)容
html()獲取元素內(nèi)
HTMLhtml(String value)設(shè)置元素內(nèi)的HTML內(nèi)容
outerHtml()獲取元素外HTML內(nèi)容
data()獲取數(shù)據(jù)內(nèi)容(例如:script和style標(biāo)簽)
tag() and tagName()
3、操作HTML和文本
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName) html(String value)
直接上代碼:
Test.java:
@Slf4j @SpringBootTest class Test { @Resource private PositionService positionService; /** * 爬取省市區(qū)網(wǎng)站 */ @Test public void test2() throws InterruptedException { //一共五級 for (int i = 0 ; i < 5 ; i++) { if (i == 0) { List<PositionEntity> positionEntities = PositionUtils.reqPosition(PositionUtils.URL_HEAD); savePosition(positionEntities, null, i); continue; } List<Position> positions = positionService.findListByLevel(i); for (Position parentPosition : positions) { List<PositionEntity> positionEntities = PositionUtils.reqPosition(String.format("%s%s%s", PositionUtils.URL_HEAD, parentPosition.getSn(), PositionUtils.URL_TAIL)); savePosition(positionEntities, parentPosition, i); } } } /** * 報(bào)錯(cuò)地址信息 */ private void savePosition(List<PositionEntity> positionEntities, Position parentPosition, int i){ for (PositionEntity entity : positionEntities) { Position position = new Position(); position.setSn(entity.getCode()); position.setFullInitials(PinyinUtils.strFirst2Pinyin((parentPosition != null ? parentPosition.getFullName() : "")+entity.getName())); position.setFullName((parentPosition != null ? parentPosition.getFullName() : "")+entity.getName()); position.setLevel(i + 1); position.setName(entity.getName()); position.setOrderNumber(0); position.setPsn(parentPosition != null ? parentPosition.getSn() : 0L); long count = positionService.countBySn(position.getSn()); if (count == 0) { positionService.savePosition(position); } } } }
PositionService.java:
public interface PositionService { void savePosition(Position position); long countBySn(Long sn); List<Position> findListByLevel(Integer level); }
PositionServiceImpl.java:
@Service public class PositionServiceImpl extends ServiceImpl<PositionMapper, Position> implements PositionService { @Override public void savePosition(Position position) { baseMapper.insert(position); } @Override public long countBySn(Long sn) { return baseMapper.selectCount(new QueryWrapper<Position>().lambda().eq(Position::getSn, sn)); } @Override public List<Position> findListByLevel(Integer level) { return baseMapper.selectList(new QueryWrapper<Position>().lambda().eq(Position::getLevel, level)); } }
PositionMapper.java:
@Repository public interface PositionMapper extends BaseMapper<Position> { }
Position.java:
@Data @TableName("position") @EqualsAndHashCode() public class Position implements Serializable { @TableId(type = IdType.AUTO) private Integer id; /** * 編碼 */ private Long sn; /** * 上級地址編碼 */ private Long psn; /** * 名稱 */ private String name; /** * 簡稱 */ private String shortName; /** * 層級 */ private Integer level; /** * 區(qū)號 */ private String code; /** * 郵政編碼 */ private String zip; /** * 拼音 */ private String spell; /** * 拼音首字母 */ private String spellFirst; /** * 地址全名 */ private String fullName; /** * 地址全名拼音首字母 */ private String fullInitials; /** * 排序 */ private Integer orderNumber; }
PositionMapper.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.wkf.workrecord.dao.PositionMapper"> </mapper>
PositionUtils.java:
public class PositionUtils { public final static String URL_HEAD = "https://xingzhengquhua.bmcx.com/"; public final static String URL_TAIL = "__xingzhengquhua/"; public static List<PositionEntity> reqPosition(String url) throws InterruptedException { String htmlStr = HttpUtils.getRequest(url); //解析字符串為Document對象 Document doc = Jsoup.parse(htmlStr); //獲取body元素,獲取class="fc"的table元素 Elements table = doc.body().getElementsByAttributeValue("bgcolor", "#C5D5C5"); //獲取tbody元素 Elements children; children = table.first().children(); //獲取tr元素集合 Elements tr = children.get(0).getElementsByTag("tr"); List<PositionEntity> result = new ArrayList<>(); //遍歷tr元素,獲取td元素,并打印 for (int i = 3; i < tr.size(); i++) { Element e1 = tr.get(i); Elements td = e1.getElementsByTag("td"); if (td.size() < 2) { break; } String name = td.get(0).getElementsByTag("td").first().getElementsByTag("a").text(); String code = td.get(1).getElementsByTag("td").first().getElementsByTag("a").text(); if (CheckUtils.isEmpty(name) || CheckUtils.isEmpty(code)) { continue; } result.add(new PositionEntity(name, Long.parseLong(code))); } //防止ip被封 Thread.sleep(10000); return result; } }
PinyinUtils.java:
public class PinyinUtils { private final static HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); static { format.setCaseType(HanyuPinyinCaseType.LOWERCASE); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); format.setVCharType(HanyuPinyinVCharType.WITH_V); } /** * 字符串轉(zhuǎn)拼音 * * @param str * 中文字符串 * @param fill * 分隔符 * @return 返回中文的拼音串 */ public static String str2Pinyin(String str, String fill) { if (null == str) { return null; } try { StringBuilder sb = new StringBuilder(); if (fill == null) fill = ""; boolean isCn = true; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (i > 0 && isCn) { sb.append(fill); } if (c == ' ') { sb.append(fill); } // 1、判斷c是不是中文 if (c >= '\u4e00' && c <= '\u9fa5') { isCn = true; String[] piyins = PinyinHelper.toHanyuPinyinStringArray(c, format); if (null == piyins || 0 >= piyins.length) { continue; } sb.append(piyins[0]); } else { // 不是中文 if (c >= 'A' && c <= 'Z') { sb.append((char)(c + 32)); } else { sb.append(c); } isCn = false; } } return sb.toString(); } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } return null; } /** * 拼音首字母 * * @param str * 中文字符串 * @return 中文字符串的拼音首字母 */ public static String strFirst2Pinyin(String str) { if (null == str) { return null; } try { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); // 1、判斷c是不是中文 if (c >= '\u4e00' && c <= '\u9fa5') { String[] piyins = PinyinHelper.toHanyuPinyinStringArray(c, format); if (null == piyins || 0 >= piyins.length) { continue; } sb.append(piyins[0].charAt(0)); } else { // 不是中文 if (c >= 'A' && c <= 'Z') { sb.append((char)(c + 32)); } else { sb.append(c); } } } return sb.toString(); } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } return null; } }
感謝各位的閱讀,以上就是“Java怎么解析html中的內(nèi)容并存到數(shù)據(jù)庫”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java怎么解析html中的內(nèi)容并存到數(shù)據(jù)庫這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。