public static string getTitle(string url) { bool mainContentExtracted; //結果 string source = ""; string title = ""; //トランスコーダー NReadabilityTranscoder nReadabilityTranscoder = new NReadabilityTranscoder(); //パーサー HtmlParser hp = new HtmlParser(); //仮想ブラウザ NonDispBrowser nb = new NonDispBrowser(); //HTMLの取得 source = hp.getHtmlSource(url); try { nb.NavigateAndWaitFromSource(hp.getHtmlPlainTextFromSourceWB(nReadabilityTranscoder.Transcode(source, out mainContentExtracted))); title = nb.Document.Title; } catch { } finally { //確実に破棄 nb.Dispose(); } //結果を返す return title; //return hp.getHtmlPlainTextFromSource(nReadabilityTranscoder.Transcode(getHtmlSource(url), out mainContentExtracted)); }
public static List<string> getLinkList(string url) { List<string> result = new List<string>(); try { NonDispBrowser ndb = new NonDispBrowser(); //2011/10/10 スクリプトエラーをもみけす ndb.ScriptErrorsSuppressed = true; //ナビゲート ndb.NavigateAndWait(url); HtmlDocument doc = ndb.Document; // リンク文字列とそのURLの列挙 foreach (HtmlElement et in doc.GetElementsByTagName("A")) { string href = et.GetAttribute("href"); // HREF属性の値 string text = et.InnerText; // リンク文字列 if (!string.IsNullOrEmpty(href) && !string.IsNullOrEmpty(text)) { result.Add(href); } } ndb.Dispose(); } catch { } return result; }
public static string transeForJapa(string url) { bool mainContentExtracted; //結果 string result = ""; string source = ""; string title = ""; //トランスコーダー NReadabilityTranscoder nReadabilityTranscoder = new NReadabilityTranscoder(); //パーサー HtmlParser hp = new HtmlParser(); //仮想ブラウザ using (NonDispBrowser nb = new NonDispBrowser()) { //HTMLの取得 source = hp.getHtmlSource(url); try { //まずは要約データからボディの取得を試みる nb.NavigateAndWaitFromSource(hp.getHtmlPlainTextFromSourceWB(nReadabilityTranscoder.Transcode(source, out mainContentExtracted))); title = nb.Document.Title; result = nb.Document.Body.InnerText.Replace(title, ""); if (result != "") { return result; } result = HtmlParser.htmlGomiRegularRemove(HtmlParser.htmlTagRegularRemove(source)); } catch { } } //結果を返す return result; //return hp.getHtmlPlainTextFromSource(nReadabilityTranscoder.Transcode(getHtmlSource(url), out mainContentExtracted)); }
/// <summary> /// Webページをキャプチャするメソッド /// </summary> public bool capture(string uri) { try { //uriチェック NonDispBrowser webBrowser = new NonDispBrowser(); //ウェブブラウザを取得する if (!getWebBrowser(ref webBrowser, uri)) { //取得に失敗したら何もしない return false; } // TODO: 下記の方法では、フレーム(FRAMESETタグ)を使っているWebページはキャプチャできない。 HtmlDocument htmlDocument = webBrowser.Document; HtmlElement htmlElement = htmlDocument.Body; // キャプチャするWebページ全体のサイズを、HtmlElement.ScrollRectangleプロパティで取得 //Rectangle rectangle = new Rectangle(new Point(0, 0), htmlElement.ScrollRectangle.Size); Rectangle rectangle = new Rectangle(new Point(0, 0), new Size(1024, 768)); // そのサイズとデスクトップと同じ解像度を持つビットマップを生成 using (Bitmap image = new Bitmap(rectangle.Size.Width, rectangle.Size.Height, Graphics.FromHwnd(parrentForm.Handle))) { using (Graphics graphics = Graphics.FromImage(image)) { // HtmlDocument.DomDocumentプロパティからIOleObjectインタフェースを取得(キャスト) IOleObject oleObject = (IOleObject)htmlDocument.DomDocument; if (oleObject != null) { // 生成したビットマップのデバイス・コンテキストを取得 IntPtr imageDC = graphics.GetHdc(); // WebBrowser.ActiveXInstanceプロパティからインタフェース(IUnknown)へのポインタを取得 IntPtr pUnk = Marshal.GetIUnknownForObject(webBrowser.ActiveXInstance); try { Size currentSize = new Size(); // IOleObject.GetExtent()メソッドで、ブラウザの現在のエクステント・サイズを保存 oleObject.GetExtent(System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, out currentSize); // キャプチャするサイズ(単位はPixel)をHIMETRIC単位に変換 Size drawingSize = convertPixelToHIMETRIC(rectangle.Size, imageDC); // 新しいエクステント・サイズをIOleObject.SetExtent()メソッドで設定 oleObject.SetExtent(System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, ref drawingSize); // OleDraw()メソッドを使用してビットマップのデバイス・コンテキストに描画 LpsWindowsApi.OleDraw(pUnk, DVASPECT.DVASPECT_CONTENT, imageDC, ref rectangle); // ブラウザのエクステント・サイズを保存していたサイズに再設定 oleObject.SetExtent(System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT, ref currentSize); } finally { // 確保していたデバイス・コンテキストやポインタは忘れず解放 Marshal.Release(pUnk); graphics.ReleaseHdc(imageDC); } // メモリ上のビットマップにはWebページ全体がキャプチャ済みなので、煮るなり焼くなり処理 //image.Save(pc.getTempPath() + uri + DateTime.Now.ToString().Replace("/","").Replace(":",""), ImageFormat.Png); saveImage(uri, image); // MEMO: キャプチャしたイメージは、このあたりで使う。実際のプログラムでは、インスタンス変数にしておいたほうが扱いが楽チン。 } graphics.Dispose(); } image.Dispose(); } htmlDocument = null; htmlElement = null; webBrowser.Dispose(); webBrowser = null; return true; } catch (Exception err) { lc.writingLog("WebCapture : capture\n" + err.ToString()); return false; } }
/// <summary> /// ウェブブラウザを取得する /// </summary> /// <param name="webBrowser"></param> /// <returns></returns> private bool getWebBrowser(ref NonDispBrowser webBrowser, string uri) { if (string.IsNullOrEmpty(uri) || uri.Equals("about:blank")) { return false; } if (!uri.StartsWith("http://")) { uri = "http://" + uri; } try { webBrowser.NavigateAndWait(uri); return true; } catch (UriFormatException) { return false; } }