'html 파싱'에 해당되는 글 2건

  1. 2012.07.22 아이폰 HtmlParsing 예제 따라하기 (3)
  2. 2012.01.20 안드로이드 html,xml 파싱 예제 따라하기 (6)
C/Objective C/ios2012.07.22 10:59

- 외부 코드를 이용해서,  Html 파싱을 해보도록 하자.

- Html  파싱은 좋은 방법이 아님으로 권장하고 싶지 않다.


- HtmlParsing 예제 따라하기

1. 브라우저를 이용하여 아래의 사이트 방문(아래에 다운받아도 가능하다)

http://blog.objectgraph.com/index.php/2010/02/24/parsing-html-iphone-development/

hpple.zip

화면 아래 부분에 있는 Donwnload the complete project file is available here를 클릭하여 파일

다운로드
2. Xcode 실행
3. Single View Application
4. Project Name : “HtmlParsingTest”
5. 1.에서 다운받은 파일에 있는 hipple 폴더를 Classes 폴더로 드래그 6. PROJECT 아래에 있는 HtmlPasingTest 클릭

6.1. [Building Settings] - [All] - [Levels] 순서대로 클릭
6.2. 우측 검색 창에 “Header Search Paths”입력
6.3. 찾은 항목 오른쪽 부분을 더블클릭 - + 클릭 - “${SDKROOT}/usr/include/libxml2“ 입력 6.4. 우측 검색 창에 “Other Linker Flags”입력
6.3. 찾은 항목 오른쪽 부분을 더블클릭 - + 클릭 - “-lxml2“ 입력

7. ViewController.m 파일 편집

page1image7376

#import "TFHpple.h" #import "TFHppleElement.h" #import "XPathQuery.h“

-(void)viewDidLoad { [super viewDidLoad];

NSString *htmlWillInsert = [NSString stringWithContentsOfURL:
[NSURL URLWithString:@"http://appcenter.ks.ac.kr"]

encoding:NSUTF8StringEncoding error:nil]; NSData *htmlData = [htmlWillInsert dataUsingEncoding:NSUnicodesStringEncoding];

TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData]; //NSArray *elements = [xpathParser search:@"//table[@width='700']//font"]; NSArray *elements = [xpathParser search:@"//a"];

for(int i = 0; i<[elements count]; i++) {

TFHppleElement *element = [elements objectAtIndex:1]; NSString *titleOfAlips = [element content];

NSLog(@"%@", titleOfAlips); }

}

8. 디버깅 

9. 실행 


- ViewController.h 소스코드


#import <UIKit/UIKit.h>

#import "TFHpple.h" 

#import "TFHppleElement.h" 

#import "XPathQuery.h"


@interface ViewController : UIViewController


@end

- ViewController.m 소스코드

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad

{

    [super viewDidLoad];

NSLog(@"connectWebsite");

    

    NSString *htmlURL = [NSString stringWithContentsOfURL:

                         [NSURL URLWithString:@"http://appcenter.ks.ac.kr"

encoding:NSUTF8StringEncoding error:nil];

//-2147481280 -> NSUTF8StringEncoding

    NSData *htmlData = [htmlURL dataUsingEncoding:NSUnicodeStringEncoding];

    if (htmlData != nil) {

        TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];

        NSArray *parserArray  = [xpathParser search:@"//*"];

        for (int i = 0; i < [parserArray count]; i++) {

            TFHppleElement *element = [parserArray objectAtIndex:i];

            NSLog(@"%@", [element content]);

        }

    }

    else {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"연결 실패"

                                                        message:@"데이터를 가져올 없습니다."

                                                       delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil];

        [alert show];

    }

    NSLog(@"connectWebsiteEnd");

}


- (void)viewDidUnload

{

    [super viewDidUnload];

    // Release any retained subviews of the main view.

}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

} else {

    return YES;

}

}


@end



- 실행화면


신고
Posted by Namseungil
JAVA/Android2012.01.20 15:53

- 인터넷에 있는 자료를 나의 App에 가져와서 데이터를 내 것 처럼 사용하는 기술이 파싱이라고 한다. 이 파싱을 이용하는 간단한 예제를 해보자.
- 네이버 html, xml 소스를 띄어보고 트윗 tag를 짤라서 화면에 출력하는 간단한 예제이다.

- Java 소스
public class Ex13_HTTPActivity extends Activity implements OnClickListener {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  Button xml = (Button) this.findViewById(R.id.xml);
  xml.setOnClickListener(this);
  Button html = (Button) this.findViewById(R.id.html);
  html.setOnClickListener(this);
  Button parse = (Button) this.findViewById(R.id.parse);
  parse.setOnClickListener(this);
 }

 @Override
 public void onClick(View arg0) {
  // TODO Auto-generated method stub
  TextView text1 = (TextView) this.findViewById(R.id.tv1);
  switch (arg0.getId()) {

  case R.id.html:
   String html = downloadURL("http://www.naver.com");
   text1.setText(html);
   break;
  case R.id.xml:
   // String name = "oisoo";
   // int count = 2;
   String url1 = "http://www.naver.com";
   // ? 뒤에는 매개변수 & 추가적인 정보
   String xml1 = downloadURL(url1);
   text1.setText(xml1);

   break;
  case R.id.parse:

   String url = "http://twitter.com/statuses/user_timeline.xml?screen_name=oisoo&count=5";
   // ? 뒤에는 매개변수 & 추가적인 정보
   String xml = downloadURL(url);
   parseXML(xml);
   break;

  }

 }

 void parseXML(String xml) {
  int itemtype = 0;
  String itemText = "";

  try {
   XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
   XmlPullParser parser = factory.newPullParser();
   parser.setInput(new StringReader(xml));
   // 여기까지 의미있는부분을 짤라준다.
   int eventType = parser.getEventType();
   while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
    case XmlPullParser.START_DOCUMENT:
     break;
    case XmlPullParser.END_DOCUMENT:
     break;
    case XmlPullParser.START_TAG:
     if (parser.getName().equals("text")) {
      itemtype = 1;
     }

    case XmlPullParser.END_TAG:
     break;
    case XmlPullParser.TEXT:
     if (itemtype == 1) {
      itemText = itemText + parser.getText() + "\n";
      itemtype = 0;
     }
     break;
    }
    eventType = parser.next();
   }
  } catch (Exception e) {
   ;
  }
  TextView text1 = (TextView) this.findViewById(R.id.tv1);
  text1.setText(itemText);

 }

 String downloadURL(String addr) {
  String doc = "";
  try {
   URL url = new URL(addr);
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();

   if (conn != null) {
    conn.setConnectTimeout(10000);
    conn.setUseCaches(false);
    if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { // 연결이
                   // 완성이됫다
     BufferedReader br = new BufferedReader(
       new InputStreamReader(conn.getInputStream()));
     for (;;) {
      String line = br.readLine();
      if (line == null)
       break;
      doc = doc + line + "\n";
     }
     br.close();
    }
    // conn.disconnect();
   }
  } catch (Exception ex) {
   ;
  }

  return doc;

 }

}

-xml 소스
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/html"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="HTML" />

        <Button
            android:id="@+id/xml"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="XML" />

        <Button
            android:id="@+id/parse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Parse XML" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >

        <TextView
            android:id="@+id/tv1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

-실행 화면

신고
Posted by Namseungil

티스토리 툴바