2012年1月31日火曜日

[Android]tagSoup で Webスクレイピング

tagSoup はHTMLパーサー。
AndroidのWebViewでも使われているらしい。
ただ、APIは公開されていないので、外部jarとして登録して使いました。
jar は公式サイトから Download できます。
http://ccil.org/~cowan/XML/tagsoup/
サイズも100kb未満で経済的。

使い方が、ちんぷんかんぷん。
一度、挫折しかけました。

こちらのサイトを参照しながら何とか実装。
http://d.hatena.ne.jp/Retrorocket/20110905/1315214059
http://www.beach5.net/2011/11/androidhtml-2.html
http://nullmo.blog89.fc2.com/blog-entry-492.html

調べた限りだと方法は2つあります。
1.Transformして、タグネームでノードを取得する方法。


Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
DOMResult result = new DOMResult();
transformer.transform(new SAXSource(reader, source), result);

Document doc = (Document) result.getNode();
NodeList childs = doc.getElementsByTagName("td");


2.Paerser にHandlerをセットして、パースしていく方法。

InputSource source = new InputSource(new InputStreamReader(in, "UTF-8"));
parser.setContentHandler(new TestHandler());
parser.parse(source);



private class TestHandler implements org.xml.sax.ContentHandler
    {
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException
        {
        }

        @Override
        public void endDocument() throws SAXException
        {
        }

        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException
        {
        }

        @Override
        public void startDocument() throws SAXException
        {
        }

        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes atts) throws SAXException
        {
       }


個人的には、2が分かりやすかったです。
のコードをコピペしてログ出すとこんな感じです。
01-30 13:12:51.300: I/System.out(4577): startDocument
01-30 13:12:51.460: I/System.out(4577): startElement:<html> 
01-30 13:12:51.490: I/System.out(4577): startElement: <head> 
01-30 13:12:51.630: I/System.out(4577): startElement:  <meta>  [http-equiv=content-type] [content=text/html;charset=Shift_JIS]
01-30 13:12:51.640: I/System.out(4577): endElement  :  <meta>
01-30 13:12:51.721: I/System.out(4577): startElement:  <meta>  [name=generator]
01-30 13:12:51.740: I/System.out(4577): endElement  :  <meta>
01-30 13:12:51.780: I/System.out(4577): startElement:  <title> 
01-30 13:12:51.810: I/System.out(4577): characters  :   [あ~か行のお店]
01-30 13:12:51.840: I/System.out(4577): endElement  :  <title>
01-30 13:12:52.000: I/System.out(4577): startElement:  <meta>  [name=Description] [content=]
01-30 13:12:52.010: I/System.out(4577): endElement  :  <meta>
01-30 13:12:52.080: I/System.out(4577): startElement:  <meta>  [name=Keywords] [content=]
01-30 13:12:52.092: I/System.out(4577): endElement  :  <meta>
01-30 13:12:52.240: I/System.out(4577): startElement:  <meta>  [name=viewport] [content=width=device-width] [user-scalable=yes]
01-30 13:12:52.250: I/System.out(4577): endElement  :  <meta>
01-30 13:12:52.379: I/System.out(4577): startElement:  <meta>  [name=format-detection] [content=telephone=no]
01-30 13:12:52.389: I/System.out(4577): endElement  :  <meta>
01-30 13:12:52.519: I/System.out(4577): startElement:  <meta>  [name=apple-mobile-web-app-capable] [content=yes]
01-30 13:12:52.539: I/System.out(4577): endElement  :  <meta>
01-30 13:12:52.690: I/System.out(4577): startElement:  <meta>  [name=apple-mobile-web-app-status-bar-style] [content=default]
01-30 13:12:52.690: I/System.out(4577): endElement  :  <meta>
01-30 13:12:52.811: I/System.out(4577): startElement:  <link>  [rel=start] [href=/] [title=ホーム]

これを足がかりに実装すればok

0 件のコメント:

コメントを投稿