C++에서 웹페이지를 그대로 보여주는 것도 좋지만, 간혹 원하는 문자열만 보여주게 하고플때가 있다. 날씨 정보라든가, 원하는 검색 결과물을 기타 불필요한 부분 필요없이 원하는 결과물만 출력시키고 싶을때 파싱을 한다.
나도 몇몇 사이트에서 내가 올린 포인트 숫자만 받고 싶을때 써먹어봤다.
밑의 소스는 파싱할 페이지를 TXT로 저장하는 방법이다.
#include <afxinet. h>
BOOL CWebDlg::OnGetPoint()
{
CInternetSession session;
CInternetFile* file = NULL;
try
{
file = (CInternetFile*) session. OpenURL("파싱할 페이지 주소");
}
catch (CInternetException* m_pException)
{
file = NULL;
m_pException->Delete();
}
CStdioFile subStore;
if (file)
{
CString somecode;
// 파싱할 페이지를 저장할 TXT 파일
BOOL bIsOk = subStore. Open(_T("subfile.txt"),
CFile::modeCreate
| CFile::modeWrite
| CFile::shareDenyWrite
| CFile::typeText);
if (!bIsOk)
return FALSE;
CString str;
// somecode 변수에 파싱할 페이지 문자를 읽어들이며, TXT 파일에 저장한다.
while (file->ReadString(somecode) != NULL)
{
somecode += "\n";
subStore. WriteString(somecode);
}
file->Close();
subStore. Close();
// 사용한 파일들을 처리한다
delete file;
return TRUE;
}
else
{
// 에러처리
return FALSE;
}
}
BOOL CWebDlg::OnGetPoint()
{
CInternetSession session;
CInternetFile* file = NULL;
try
{
file = (CInternetFile*) session. OpenURL("파싱할 페이지 주소");
}
catch (CInternetException* m_pException)
{
file = NULL;
m_pException->Delete();
}
CStdioFile subStore;
if (file)
{
CString somecode;
// 파싱할 페이지를 저장할 TXT 파일
BOOL bIsOk = subStore. Open(_T("subfile.txt"),
CFile::modeCreate
| CFile::modeWrite
| CFile::shareDenyWrite
| CFile::typeText);
if (!bIsOk)
return FALSE;
CString str;
// somecode 변수에 파싱할 페이지 문자를 읽어들이며, TXT 파일에 저장한다.
while (file->ReadString(somecode) != NULL)
{
somecode += "\n";
subStore. WriteString(somecode);
}
file->Close();
subStore. Close();
// 사용한 파일들을 처리한다
delete file;
return TRUE;
}
else
{
// 에러처리
return FALSE;
}
}
파싱할 페이지를 TXT로 저장했으면, 여기서 원하는 문자열을 뽑으면 된다.
보통 CString의 Find 메쏘를 이용해 원하는 문자열 라인을 찾은 후에 원하는 조각을 출력시키면 된다.
void CWebDlg::PrintPoint()
{
CStdioFile sf;
CString strTemp, strPoint;
int nStart = 0, nEnd = 0;
// 파싱한 txt 파일을 불러온다.
if(sf. Open("subfile.txt", CFile::modeRead))
{
while(sf. ReadString(strTemp) != NULL)
{
// txt 파일 라인들을 돌며 원하는 문자열 라인을 찾는다.
if(strTemp. Find("현재 :") > 0)
{
// 원하는 라인을 찾았으면 원하는 단어를 출력하기 위해 단어의 위치를 찾아야 한다.
// 그래서 그 단어의 앞뒤 문자의 인덱스를 찾아 리턴시킨다.
nStart = strTemp. Find(" "); nEnd = strTemp. Find("가능");
strPoint += strTitle;
// 앞뒤 문자의 인덱스를 얻어냈으면, Mid 메쏘드를 이용해 원하는 단어만 뽑아낸다.
strPoint += strTemp. Mid(nStart+28, nEnd-nStart-33);
this->SetWindowText(strPoint);
}
}
}
else
{
MessageBox("파일이 없어요");
}
sf. Close();
}
{
CStdioFile sf;
CString strTemp, strPoint;
int nStart = 0, nEnd = 0;
// 파싱한 txt 파일을 불러온다.
if(sf. Open("subfile.txt", CFile::modeRead))
{
while(sf. ReadString(strTemp) != NULL)
{
// txt 파일 라인들을 돌며 원하는 문자열 라인을 찾는다.
if(strTemp. Find("현재 :") > 0)
{
// 원하는 라인을 찾았으면 원하는 단어를 출력하기 위해 단어의 위치를 찾아야 한다.
// 그래서 그 단어의 앞뒤 문자의 인덱스를 찾아 리턴시킨다.
nStart = strTemp. Find(" "); nEnd = strTemp. Find("가능");
strPoint += strTitle;
// 앞뒤 문자의 인덱스를 얻어냈으면, Mid 메쏘드를 이용해 원하는 단어만 뽑아낸다.
strPoint += strTemp. Mid(nStart+28, nEnd-nStart-33);
this->SetWindowText(strPoint);
}
}
}
else
{
MessageBox("파일이 없어요");
}
sf. Close();
}