ÃֽŠ°Ô½Ã±Û(JAVA)
2017.07.10 / 17:15

jsoup - ÀÚ¹Ù¸¦ À§ÇÑ BeautifulSoup (HTML parser)

XMaLL°ü¸®ÀÚ
Ãßõ ¼ö 274

ÀÚ¹Ù¸¦ À§ÇÑ Beautiful Soup

ÆÄÀ̽㿡´Â BeautifulSoupÀ̶ó°í ÇÏ´Â ¸ÚÀÖ´Â HTML Æļ­°¡ ÀÖ½À´Ï´Ù. BeautifulSoup¿¡ ´ëÇؼ­´Â ÀÌÀü¿¡ Àú ºí·Î±×¿¡µµ Æ÷½ºÆÃÀ» ÇÑÀûÀÌ ÀÖ½À´Ï´Ù. BeautifulSoupÀº Á¤¸» »ç¿ëÇϱâ ÆíÇÏ°í ´Ù¾çÇÑ ±â´ÉµéÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â À¯¿ëÇÑ ÆÄÀ̽㠱â¹ÝÀÇ HTML Æļ­ÀÔ´Ï´Ù. ´Ù¸¥ ¾ð¾î¿¡µµ BeautifulSoup°ú °°Àº ¶óÀ̺귯¸®°¡ ÀÖÀ¸¸é ¾ÈµÈ´Ù´Â ¹ýÀº ¾ø½À´Ï´Ù. ÀÚ¹Ù¿¡´Â jsoup (À̸§ºÎÅÍ µû¶óÇß´Ù´Â ´À³¦ÀÌ µå´Â) À̶ó´Â HTML Æļ­°¡ ÀÖ½À´Ï´Ù. jsoupÀº HTML ¹®¼­¸¦ ÀоîµéÀÎ ÈÄ¿¡ ±× ¹®¼­¸¦ DOM °´Ã¼·Î º¯È¯À» ÇÏ°Ô µË´Ï´Ù. ±×¸®°í ³ª¼­ jsoupÀÇ selector api¸¦ ÀÌ¿ëÇؼ­ ƯÁ¤ Element¿¡ Á¢±ÙÀ» ÇÒ ¼ö ÀÖ°í, ÇØ´ç ElementÀÇ Á¤º¸¸¦ Àаųª ¼öÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. jsoupÀº jqueryÀÇ selector¿Í ºñ½ÁÇÑ selector api¸¦ Á¦°øÇϱ⠶§¹®¿¡ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

¡Ø ¾Æ·¡ ±ÛÀº jsoupÀÇ °ø½Ä ¹®¼­¸¦ Âü°íÇÏ¿© ÀÛ¼ºµÇ¾ú½À´Ï´Ù.

jsoup ½ÃÀÛÇϱâ

jsoupÀº ±âº»ÀûÀ¸·Î HTMLÇü½ÄÀÇ stringÀ» ³Ñ°ÜÁÖ¸é ÀÚ¹Ù¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â DOM °´Ã¼·Î ¸¸µé¾î ÁÖ´Â parserÀÌÁö, À¥ÆäÀÌÁö¸¦ ÀоîµéÀÌ´Â ±â´É±îÁö ÇÏ´Â ¶óÀ̺귯¸®´Â ¾Æ´Õ´Ï´Ù. Jsoup.parse(String url, int timeoutMillisecons) api¸¦ ÀÌ¿ëÇϸé URL·Î ºÎÅÍ À¥ ÆäÀÌÁö¸¦ Àоî¿Í¼­ ¾Ë¾Æ¼­ DOM °´Ã¼·Î º¯È¯ÇØ ÁÖ±ä ÇÏÁö¸¸ jsoupÀº ³×Æ®¿öÅ© ¶óÀ̺귯¸®´Â ¾Æ´Ï¿©¼­ ÇØ´ç api¸¦ »ç¿ëÇÏ´Â °ÍÀº Ãßõµå¸®Áö ¾Ê°í AsyncHttpClient¿Í °°Àº ³×Æ®¿öÅ© Àü¿ë ¶óÀ̺귯¸®·Î HTMLÀ» Àоî¿Â ´ÙÀ½¿¡ Àоî¿Â stringÀ» jsoupÀ¸·Î º¯È¯½ÃÅ°´Â ¹æ¹ýÀ» Ãßõµå¸³´Ï´Ù.

HTMLÀ» Àоî¿Ô´Ù¸é jsoup document °´Ã¼·Î º¯È¯½ÃÅ°´Â ¹æ¹ýÀº °£´ÜÇÕ´Ï´Ù.

String html = ....(html ¹®¼­)

Document doc = Jsoup.parse(html);

ÀÌÁ¦ ÀÌ·¸°Ô Document °´Ã¼·Î ¸¸µé°í ³ª¼­´Â ¾Ë¾Æ¼­ ÁöÁö°í ººÀ¸½Ã¸é µË´Ï´Ù. À̹ø¿¡´Â ÀÚ¼¼ÇÑ ¿ä¸®¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù.

DOM ŽÇèÇϱâ

Document °´Ã¼¸¦ ¸¸µé¾úÀ¸´Ï ÀÌÁ¦ HTML ¹®¼­ ¾È¿¡ ¹«¾ùÀÌ ÀÖ´ÂÁö ã¾ÆºÁ¾ß ÇÒ Â÷·ÊÀÔ´Ï´Ù. Navigating¿¡ °ü·ÃµÈ API´Â Å©°Ô 2°¡Áö°¡ ÀÖ½À´Ï´Ù. °¢°¢ÀÇ api¿¡ ´ëÇØ Â÷·Ê´ë·Î ¼³¸íÇϵµ·Ï ÇÏ°ì½À´Ï´Ù.

ÀüÅëÀûÀÎ ¹æ½ÄÀÇ Navigating api

 getElementById(), getElementsByTag(), getElementsByClass(), getElementsByAttribute()¿Í °°Àº ¸Þ½îµå¸¦ ÀÌ¿ëÇÏ¿© ƯÁ¤ Element¸¦ ã¾Æ ³¾ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­ Á¶½ÉÇØ¾ß È° °ÍÀº getElementById ¸¸ Element ÀÌ°í, ³ª¸ÓÁö´Â Elements ¶ó´Â Á¡ÀÔ´Ï´Ù. Id´Â ÇϳªÀÇ Element¸¸ °¡Áö°í ÀÖ´Â °íÀ¯ ¼Ó¼ºÀ̱⠶§¹®¿¡ ´ÜÀÏ Element¸¦ µ¹·ÁÁÝ´Ï´Ù. ±×¸®°í Elements´Â ArrayList<Element> °°Àº °ÍÀÌ ¾Æ´Ï°í Elements¶ó°í ÇÏ´Â °´Ã¼°¡ µû·Î Á¸ÀçÇÕ´Ï´Ù. ±×·¡µµ Elements´Â List ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇ߱⠶§¹®¿¡ ÀÏ¹Ý ¸®½ºÆ® ó·³ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. 

Elements´Â ListÀ̱ä ÇÏÁö¸¸ jquery °´Ã¼ ó·³ ÀÏÁ¾ÀÇ monadÀÔ´Ï´Ù. Áï, Element¿¡ ÀÖ´Â ´ëºÎºÐÀÇ ¸Þ½îµå¸¦ °¡Áö°í ÀÖ°í ÇØ´ç ¸Þ½îµå¸¦ È£ÃâÇϸé Elements ³»ºÎ¿¡ ÀÖ´Â ¸ðµç Element¿¡¼­ ÇØ´ç ¸Þ½îµå¸¦ È£ÃâÇÏ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î Elements¿¡´Â addClass(String className) ¸Þ½îµå°¡ ÀÖ½À´Ï´Ù. ÇØ´ç ¸Þ½îµå¸¦ È£ÃâÇÏ°Ô µÇ¸é Elements°¡ Æ÷ÇÔÇÏ°í ÀÖ´Â ¸ðµç Element¿¡ ÇØ´ç Ŭ·¡½º À̸§ÀÌ Ãß°¡µË´Ï´Ù.  

jquery ¹æ½ÄÀÇ Navigating api

jqueryó·³ $('.class#id') ¿Í ºñ½ÁÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ½îµå°¡ jsoup¿¡ ÀÖ½À´Ï´Ù. select ¸Þ½îµå¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù.

Document doc = Jsoup.parse(html);

Elements elements = doc.select(".class #id");

select ¸Þ½îµå´Â string ÀÎÀÚ¸¦ Çϳª¸¦ ¹Þ°í, ÇØ´ç ÀÎÀÚ´Â jquery¿¡¼­ »ç¿ëµÇ´Â selector¿Í ºñ½ÁÇÑ css queryÀÔ´Ï´Ù. ¸®ÅÏ°ªÀº Elements ÀÔ´Ï´Ù. Selector¿¡ id °ªÀ» ³Ö¾î °®¾î¿Ô´Ù°í Çصµ ¾ÖÃÊ¿¡ select ¸Þ½îµåÀÇ ¸®ÅÏ Å¸ÀÔÀº Elements À̹ǷΠ¾î¶µç Elements¸¦ ¹ÝȯÇÕ´Ï´Ù. Element¸¦ °¡Á®¿À°í ½Í´Ù¸é elements.first()¶ó°í ÇÏ¸é ½±°Ô Element¸¦ °®¾î¿Ã ¼ö ÀÖ½À´Ï´Ù. select ¸Þ½îµå´Â getElementById¿Í getElementByTag¿Í getElementByClass ¸Þ½îµå¸¦ ¿©·¯¹ø È£ÃâÇØ¾ß ÇÏ´Â ÀÏÀ» Çѹø¿¡ ÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù. ±×¸¸Å­ ±²ÀåÈ÷ À¯¿ëÇÏ°í Æí¸®ÇÑ ±â´ÉÀÔ´Ï´Ù.Java ½ºÅ¸ÀÏ °°¾Æ º¸ÀÌÁø ¾ÊÁö¸¸, jqueryÀÇ ÈǸ¢ÇÑ ºÎºÐÀ» Àß °®¾î¿Í¼­ ±¦ÂúÀº api ¶ó°í »ý°¢ÇÕ´Ï´Ù.

±×¸®°í »ç½Ç select ¸Þ½îµå´Â »ý°¢º¸´Ù ±²ÀåÈ÷ °­·ÂÇÕ´Ï´Ù. jsoupÀÇ select syntax ¹®¼­¸¦ º¸¸é ±«»óÇÑ SelectorµéÀÌ Á¸ÀçÇÕ´Ï´Ù. °¡·É select("img[src$=.png]")´Â À̹ÌÁö ű×Áß ¼Ò½º ÆÄÀÏ À̸§ÀÌ .pngÀ» Æ÷ÇÔÇÏ°í Àִ ű׵鸸 ÃßÃâÇÕ´Ï´Ù. $=´Â ÇØ´ç ¹®ÀÚ¿­·Î ³¡³ª´Â attributeÀÌ ÀÖ´Â È®ÀÎÇÒ ¼ö ÀÖ´Â selectorÀÔ´Ï´Ù. ºñ½ÁÇÑ selector·Î ^=´Â ÇØ´ç ¹®ÀÚ¿­·Î ½ÃÀÛÇÏ´Â attribute°¡ ÀÖ´ÂÁö ã°í, *= ´Â ÇØ´ç ¹®ÀÚ¿­À» Æ÷ÇÔÇÏ´ÂÁö È®ÀÎÇÕ´Ï´Ù. ÀÌ ÀÌ¿Ü¿¡µµ ´Ù¾çÇÑ selectorµéÀÌ ÀÖÀ¸´Ï jsoupÀÇ select syntax ¹®¼­¸¦ Âü°íÇϼż­ ÀÀ¿ëÇÏ½Ã¸é µË´Ï´Ù.


±× ¿ÜÀÇ Traversing Api 


±× ¿Ü¿¡ node¿¡ Á÷Á¢ Á¢±ÙÇÏ´Â api°¡ ¾Æ´Ñ ƯÁ¤ ³ëµå¿Í ¿¬°üµÈ Element¸¦ ã´Â api·Î´Â ½±°Ô »ý°¢ÇÒ ¼ö ÀÖ´Â siblingElements(), firstElementSibling(), lastElementSibling(), nextElementSibling, previousElementSibling(), °°Àº ¸Þ½îµåµéÀÌ ÀÖ°í parent(), children(), child(int index)¿Í °°Àº ¸Þ½îµåµéµµ Á¸ÀçÇÕ´Ï´Ù. (siblingÀº ¼±ÅõǾî ÀÖ´Â element¿Í ºñ½ÁÇÑ element¸¦ ã´Â apiÀÔ´Ï´Ù. ºñ½ÁÇÏ´Ù´Â ¸»Àº <ul> ÅÂ±× ¾Æ·¡¿¡ <li>ű׵éÀÌ ¿©·¯°³°¡ ÀÖÀ»¶§ ÇϳªÀÇ <li>¸¦ ¼±ÅÃÇÑ ÈÄ¿¡ nextElementSibling ¸Þ½îµå¸¦ È£ÃâÇÏ¸é ´ÙÀ½ <li> Element¸¦ µ¹·ÁÁÝ´Ï´Ù.)

¶ÇÇÑ Æ¯Á¤ ³ëµåÀÇ data¸¦ °®¾î¿Ã ¼ö ÀÖ´Â apiµµ Á¸ÀçÇÕ´Ï´Ù. (´ç¿¬ÇÏ°ÚÁö¸¸) attr(String key), attributes(), id(), className(), classNames(), text(), html(), outerHtml(), data(), tag(), tagName()°ú °°Àº apiµéÀÌ Á¸ÀçÇÕ´Ï´Ù. attr, text, html µîÀÇ ¸Þ½îµåµéÀº jquery¿Í ºñ½ÁÇÏ°Ô String ÀÎÀÚ¸¦ ³Ñ°ÜÁÖ¸é setter api°¡ µË´Ï´Ù. °¡·É attr(String key, String value) ¸Þ½îµå°¡ Á¸ÀçÇؼ­ ÀÌ ¸Þ½îµå¸¦ ÀÌ¿ëÇϸé elementÀÇ attr¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.    


µ¥ÀÌÅÍ ¼öÁ¤

À§¿¡¼­ ¸»ÇßµíÀÌ ÇØ´ç Element¸¦ ã¾ÒÀ¸¸é element.attr(String key, String value) ¸Þ½îµå¸¦ È£ÃâÇϸé attribute¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¶Âù °¡Áö·Î element.text(String text), element.html(String html) À» »ç¿ëÇϸé Element ³»ºÎÀÇ ³»¿ëÀ» ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. element.append(String tag)³ª element.prepand(String tag)¸¦ ÀÌ¿ëÇؼ­ ³ëµå¸¦ Ãß°¡ÇÒ ¼ö µµ ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ jquery´Â html ÆÄÀÏÀ» À¥ºê¶ó¿ìÀú¿¡¼­ µ¿ÀûÀ¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖÁö¸¸, ÀÚ¹Ù´Â À¥ºê¶ó¿ìÀú¸¦ µ¿ÀûÀ¸·Î ¹Ù²Ù´Â Ç÷§ÆûÀº ¾Æ´Ï¿©¼­ DOM ¹®¼­¸¦ ¼öÁ¤ÇÏ´Â ÀÏÀÌ º°·Î ¾øÀ» °Í °°½À´Ï´Ù. ¾ðÁ¦ ¾µÀÏÀÌ ÀÖ´ÂÁöµµ Àß ¸ð¸£°Ú°í¿ä. ¾Æ¹«Æ° DOMÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù´Â ±â´ÉÀÌ ÀÖ´Ù´Â Á¤µµ¸¸ ¾Ë¾ÆµÎ¸é µÇ°Ú½À´Ï´Ù.


°£´ÜÇÑ ÆĽ̿¬½À (Çѱ¹ ÇÁ·Î ¾ß±¸ ¼øÀ§)

½Ç½ÀÀ» ÅëÇØ ¹è¿öº¸´Â °ÍÀÌ °¡Àå È¿À²ÀûÀÎ ¹æ¹ýÀÌ°ÚÁö¿ä? À̹ø¿¡´Â °£´ÜÇÑ ÆÄ½Ì ÇÁ·Î±×·¥À» ¸¸µé¾î º¸·Á°í ÇÕ´Ï´Ù. ³×À̹ö¿¡ º¸¸é Çѱ¹ ÇÁ·Î ¾ß±¸ ¼øÀ§°¡ ³ª¿Í ÀÖ´Â ÆäÀÌÁö°¡ ÀÖ½À´Ï´Ù. http://kbodata.news.naver.com/m_rank/rank_team.asp ÇØ´ç ÆäÀÌÁö·Î µé¾î°¡ º¸¸é Å×À̺íÀÌ Çϳª ÀÖ°í Å×ÀÌºí ¾È¿¡ ÇÁ·Î ¾ß±¸ ±¸´ÜµéÀÇ ¼øÀ§¿Í ½Â,ÆÐ,¹«, ½Â·üµîÀÌ ÀûÇôÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Ç¥¸¦ ÆĽÌÇؼ­ °£´ÜÇÏ°Ô Ãâ·ÂÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù. Àú´Â ÀÌ ½Ç½À¿¡¼­ jsoup°ú apache commonsÀÇ HttpClient¸¦ »ç¿ëÇß½À´Ï´Ù. ¾Æ·¡´Â Á¦ ÇÁ·ÎÁ§Æ®ÀÇ ÇÁ·ÎÁ§Æ® ±¸Á¶ÀÔ´Ï´Ù.

ÇÁ·ÎÁ§Æ® ±¸Á¶ÇÁ·ÎÁ§Æ® ±¸Á¶


Main ¿¡¼­´Â HttpClinent¸¦ ÀÌ¿ëÇÏ¿© À¥ÆäÀÌÁö¸¦ °¡Á®¿À°í, jsoupÀ» ÀÌ¿ëÇؼ­ ÇØ´ç HTML ÆÄÀÏÀ» ÆĽÌÇؼ­ ¿øÇÏ´Â ºÎºÐ¸¸ °ñ¶ó³»¾î Ãâ·ÂÇÏ°Ô µË´Ï´Ù. À¥ÆäÀÌÁöÀÇ ±¸Á¶¸¦ º¸¸é ´ÙÀ½°ú °°½À´Ï´Ù. 


³×À̹ö ÇÁ·Î ¾ß±¸ ¼øÀ§³×À̹öÀÇ ÇÁ·Î ¾ß±¸ ¼øÀ§ ÆäÀÌÁö ºÐ¼®


º¸½Ã´Ù½ÃÇÇ µ¥ÀÌÅÍ´Â <table class="table_board2> ¶ó´Â Å×ÀÌºí ¾È¿¡ ÀÖ½À´Ï´Ù. ÇØ´ç Å×À̺íÀ» ã¾Æ¼­ Å×À̺íÀÇ °¢°¢ÀÇ ÇàÀ» Àß ¿ì·Á³»¼­ Ãâ·ÂÇÏ¸é µÉ°Í °°³×¿ä.

Á¦°¡ ÀÛ¼ºÇÑ ¼Ò½ºÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<p>import java.io.IOException;
import java.util.Iterator;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class Main {
  public static void main(String args[]) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet("http://kbodata.news.naver.com/m_rank/rank_team.asp");
    try {
      httpClient.execute(httpget, new BasicResponseHandler() {
        @Override
        public String handleResponse(HttpResponse response) throws HttpResponseException,
            IOException {
          // À¥ÆäÀÌÁö¸¦ ±×³É °®¾î¿À¸é ÇѱÛÀÌ ±úÁ®¿ä. ÀÎÄÚµù 󸮸¦ ÇؾßÇØ¿ä.
          String res = new String(super.handleResponse(response).getBytes("8859_1"), "euc-kr");
          Document doc = Jsoup.parse(res);
          Elements rows = doc.select("table.table_board2 tbody tr");
          String[] items = new String[] { "¼øÀ§", "ÆÀ", "°æ±â¼ö", "½Â", "ÆÐ", "¹«", "½Â·ü", "¿¬¼Ó",
              "ÃÖ±Ù 10°æ±â" };
          for (Element row : rows) {
            Iterator<Element> iterElem = row.getElementsByTag("td").iterator();
            StringBuilder builder = new StringBuilder();
            for (String item : items) {
              builder.append(item + ": " + iterElem.next().text() + "   \t");
            }
            System.out.println(builder.toString());
          }
 
          return res;
        }
      });
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
</p>

HttpClient¸¦ ÀÌ¿ëÇÏ¿© html ÆäÀÌÁö¸¦ °®¾î¿À¸é ±× html ÆäÀÌÁö¸¦ jsoupÀÇ Document °´Ã¼·Î ¸¸µì´Ï´Ù. ±× ÀÌÈÄ¿¡ ÀÌ·ç¾î Áö´Â ÀÏÀÌ ¸¶¼úÀÔ´Ï´Ù.

doc.select("table.table_board2 tbody tr")

À§ÀÇ Selector¸¦ ÀÌ¿ëÇϸé <table class="table_board2> ¾È¿¡ ÀÖ´Â <tbody> ¾È¿¡ ÀÖ´Â ¸ðµç <tr>¸¦ °®¾î¿À°Ô µË´Ï´Ù. ÀÌ·¸°Ô °®¾îÁØ Çàµé¿¡ ÀÖ´Â <td> ű׿¡ ÀÖ´Â °ªµéÀ» È®ÀÎÇÏ¿© Ãâ·ÂÇϱ⸸ ÇÏ¸é µË´Ï´Ù. ´Ù¸¥ ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ´Â °Í¿¡ ºñÇؼ­ ±²ÀåÈ÷ °£´ÜÇÕ´Ï´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº ±ÛÀÌ Ãâ·ÂµË´Ï´Ù.

ÇÁ·Î ¾ß±¸ ¼øÀ§jsoupÀ» ÀÌ¿ëÇÑ ÇÁ·Î ¾ß±¸ ¼øÀ§ ÆĽÌ


¸¶Ä¡¸é¼­

ÀÚ¹Ù°¡ ¾Èµå·ÎÀÌµå ±âº» ¾ð¾î·Î ¼±Åõʿ¡ µû¶ó¼­ ÀÚ¹Ù°¡ º»°ÝÀûÀ¸·Î Ŭ¶óÀ̾ðÆ® ¾ð¾î·Î »ç¿ëµÇ±â ½ÃÀÛÇß½À´Ï´Ù. ±×·¯¸é¼­ HTML¸¦ ½±°Ô ÆĽÌÇÒ ¼ö ÀÖ´Â ¶óÀ̺귯¸®°¡ ÀÖ¾úÀ¸¸é ÇÏ´Â ´ÏÁî°¡ »ý±â±â ½ÃÀÛÇß½À´Ï´Ù. ("À¥Å÷À» ÆĽÌÇؼ­ À¥Å÷À» Æí¸®ÇÏ°Ô º¼ ¼ö ÀÖ´Â À¥Å÷¾ÛÀ» ¸¸µé¾î º¸°Ú´Ù!" °°Àº »ý°¢ ¸¹ÀÌ ÇϽÃÁö ¾Ê³ª¿ä?) ±×·¯´ø ¿ÍÁß¿¡ jsoupÀº ±²ÀåÈ÷ À¯¿ëÇÑ ¶óÀ̺귯¸® ¶ó°í »ý°¢ÇÕ´Ï´Ù. ³ª¿ÂÁö´Â ²Ï µÇ¾ú´Âµ¥, ÃÖ±Ù¿¡ ¿Í¼­¾ß jsoup¿¡ ´ëÇØ ¾Ë°Ô µÇ¾ú´Ù´Â Á¡ÀÌ Á¶±Ý ¾ÈŸ±õ³×¿ä. ¾Æ¹«Æ° jsoupÀ̶ó´Â ÁÁÀº ¶óÀ̺귯¸®¸¦ ¾Ë°Ô µÇ¾úÀ¸´Ï Àß È°¿ëÇϸé HTML ÆĽ̵ûÀ§´Â ½ÄÀºÁ× ¸Ô±â°¡ µÉ °ÍÀÔ´Ï´Ù.(???)

ÀúÀÛÀÚ Ç¥½Ã
½Å°í