안녕하세요.
jericho 파싱중에 IndexOutOfBoundsException 오류에 관한 문제에 대해 답을 얻고자 질문드립니다.
String yourUrl = "http://www.inje.ac.kr/template/Bsub_page.asp?Ltype=5&Ltype2=3&Ltype3=3&Tname=S_Food&Ldir=board/S_Food&Lpage=s_food_view";
위 url을 통해 아래와 같이 필요한 테이블의 문자열을 파싱해옵니다.
여기서 문제가 발생하더군요.
public String getHtmltoText(String sourceUrlString) {
// Source source = null;
String content = null;
try {
URL sUrl= new URL("sourceUrlString);
InputStream is = sUrl.openStream();
Source source=new Source(new InputStreamReader(is,"euc-kr"));
source.fullSequentialParse();
Element table = (Element)source.getAllElements(HTMLElementName.TABLE).get(14);
Element tr = (Element)table.getAllElements(HTMLElementName.TR).get(0);
Element td = (Element)tr.getAllElements(HTMLElementName.TD).get(0);
Element table1 = (Element)td.getAllElements(HTMLElementName.TABLE).get(0);
Element tr1 = (Element)table1.getAllElements(HTMLElementName.TR).get(4);
Element td1 = (Element)tr1.getAllElements(HTMLElementName.TD).get(2);
content = td1.getTextExtractor().toString();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
기존에는 문제없이 되었는데 홈페이지 업데이트 이후에 홈페이지의 테이블이 변경되어 새로이 파싱을 하기위해
변경된 테이블에 맞게 다시 수정중에 아래 값을 파싱해오기위해 위와 같이 코딩하였습니다.
<tr class="table_td_bottomB">
<TD rowspan=2 class='table_td_bottomB'><B>점심</B></TD><TD class='table_td_leftbottomC'><B>A</B></TD>
<td class="table_td_leftbottomC">(즉석)순대국밥<br>비빔쫄면<br>고추,양파,쌈장<br><br> </td>
<td class="table_td_leftbottomC">(즉석)돌솥반계탕<br>(300개한정)<br>찍초,양파,쌈장,겉절이<br> </td>
<td class="table_td_leftbottomC">(즉석)뚝배기콩불<br>모듬쌈+쌈장<br>미트볼케찹조림<br> </td>
<td class="table_td_leftbottomC">(즉석)돌솥홍합탕<br>매운두부조림<br>김구이+유장<br> </td>
<td class="table_td_leftbottomC">(즉석)뚝배기해물짬뽕<br>탕수육+소스<br>물만두<br> </td>
</tr>
순대국밥이 getAllElements(HTMLElementName.TD).get(2);
돌솥반계탕이 getAllElements(HTMLElementName.TD).get(3);
순으로 뽑아오는데요
처음 파싱해올때는 순대국밥 , 뚝배기콩불, 뚝배기 해물짬뽕 만 가지고오고
돌솥반계탕과 돌솥홍합탕은 IndexOutOfBoundsException 이 발생합니다.
두번쨰 다시 받을때는 돌솥 반계탕과 돌솥 홍합탕만 받아오고 나머지는 IndexOutOfBoundsException 이 발생합니다.
어떻게 오류를 잡아주어야 할지.. 정말 답답허네요 ㅠㅠ.. 방법없을까요?
getAttributeValue 로 table_td_leftbottomC 를 찾은후에 그에 맞는 td 의 index값으로 찾아주란 말씀이신가요?
우선 먼가 길이 보이는거 같네요 감사합니다 ^^
List<Element> tdList = (some upper element).getAllElements(HTMLElementName.TD);
for(Iterator<Element> tdIter=tdList.iterator(); tdIter.hasNext();){
Element td = (Element)tdIter.next();
String tag = td.getAttributeValue("class");
if("table_td_leftbottomC".equals(tag){
td.......
}
}네 이런 식으로 어떨까요. 사실 사이트가 안 들어가져서 어떤 구조로 되어있는지 모르겠네요




에러에 대한 답은 아닙니다만 테이블 위치 순서 같은 게 변할 수 있는 사이트라면
먼저 td 리스트를 만들고 태그 이름이 table_td_leftbottomC인 걸 찾는(getAttributeValue) 게 낫지 않을까요