【问题标题】:Screen Scraping, Web Scraping, Web Harvesting, Web Data Extraction, etc. using C# and the .NET Framework使用 C# 和 .NET Framework 进行屏幕抓取、Web 抓取、Web Harvesting、Web 数据提取等
【发布时间】:2012-02-28 01:16:11
【问题描述】:

我正在为 Web Harvesting、Web Scraping、Web Data Extraction、Screen Scraping 等编写 Microsoft .NET Application in C#。无论你想怎么称呼它。为了解析HTML,我正在尝试合并HTML Agility Pack,但这并不像我想象的那么容易。我已经包含了一些我到目前为止所拥有的规格和图像,并希望得到你对我如何进行的意见。基本上,我想做一些类似于 Visual Web Ripper 中使用的布局,但我不知道他们是如何做到的......有什么想法吗?

规格:

我的目标是制作一个用户友好的点击式应用​​程序,用于从网络下载数据和图像。我想使用网络浏览器加载 HTML 页面,并将解析的数据和图像链接输出到文本框中。用户可以指定他们想要的 HTML 标签,然后将数据下载到网格中。最后,将数据导出为他们需要的任何格式。

我正在尝试使用 HTML Agility Pack 在网页上加载 HTML 并将其显示在文本框中。

// Load Web Browser
private void Form6_Load(object sender, EventArgs e)
{
    // Navigate to webpage
    webBrowser.Navigate("http://www.webopedia.com/TERM/H/HTML.html");
    // Save URL to memory
    SiteMemoryArray[count] = urlTextBox.Text; 
    // Load HTML from webBrowser
    HtmlWindow window = webBrowser.Document.Window; 
    string str = window.Document.Body.OuterHtml;
    // Extract tags using HtmlAgilityPack and display in textbox
    HtmlAgilityPack.HtmlDocument HtmlDoc = new HtmlAgilityPack.HtmlDocument();
    HtmlDoc.LoadHtml(str);
    HtmlAgilityPack.HtmlNodeCollection Nodes =
        HtmlDoc.DocumentNode.SelectNodes("//a");
    foreach (HtmlAgilityPack.HtmlNode Node in Nodes)
    {
        textBox2.Text += Node.OuterHtml + "\r\n";
    }
}

使用:

HtmlWindow window = webBrowser.Document.Window;

我收到错误:Object reference not set to an instance of an object

【问题讨论】:

  • 这些截图非常漂亮。您使用的是什么 GUI 库?
  • 谢谢。它是 DotNetBar 和 eXpressApp 框架。有什么想法吗?
  • TBH,您的问题需要更具体。见stackoverflow.com/faqstackoverflow.com/questions/how-to-ask
  • 您到底希望人们提供什么帮助?
  • 有没有在线使用简单 Windows 窗体界面的 HTML Agility Pack 示例?

标签: c# .net visual-studio web-scraping html-agility-pack


【解决方案1】:

当您引用浏览器窗口时,您可能没有完成页面加载。您可以让浏览器控件在完成后触发 navigationcomplete 事件。有关示例,请参见此 SO 答案:C# how to wait for a webpage to finish loading before continuing

【讨论】:

    【解决方案2】:

    我不熟悉HTMLAgilityPack,但我过去使用过的一个组件是SGMLReaderhttp://developer.mindtouch.com/SgmlReader。它的功能类似于 XMLReader 的直接替换,如果您愿意,甚至可以为您将文档转换为 XML。您可以将其加载到 XMLDocument(甚至是 XDocument)中,然后由您决定如何使用它。

    所以我建议使用HTTPWebRequest 来获取 HTML,然后将 HTML 加载到这个组件中。这样您就无需靠近WebBrowser 控件。

    【讨论】:

    【解决方案3】:

    对于屏幕抓取,如果您正在搜索特定的图像/形状,您可以使用:

    EMGU

    您也可以像这样使用WinAPI read 屏幕:

    private Bitmap Capture(IntPtr hwnd)
    {
        return Capture(hwnd, GetClientRectangle());
    }
    
    private Bitmap Capture(IntPtr hwnd, Rectangle zone)
    {
        IntPtr hdcSrc = GetWindowDC(hwnd);
        IntPtr hdcDest = CreateCompatibleDC(hdcSrc);
        IntPtr hBitmap = CreateCompatibleBitmap(hdcSrc, zone.Width, zone.Height);
        IntPtr hOld = SelectObject(hdcDest, hBitmap);
        BitBlt(hdcDest, 0, 0, zone.Width, zone.Height, hdcSrc, zone.X, zone.Y, SRCCOPY);
        SelectObject(hdcDest, hOld);
        DeleteDC(hdcDest);
        ReleaseDC(hwnd, hdcSrc);
        Bitmap retBitmap = Bitmap.FromHbitmap(hBitmap);
        DeleteObject(hBitmap);
        return retBitmap;
    }
    

    【讨论】:

      【解决方案4】:

      解析HTML 文档:

      using SHDocVw; //Interop.SHDocVw.dll
      using mshtml; //Microsoft.mshtml.dll
      
      InternetExplorer ie= new InternetExplorer();
      ie.Navigate("www.example.com");
      ie.Visible = true;
      Thread.Sleep(5000); //Wait until page loads.
      mshtml.HTMLDocument doc;
      doc = ie.Document; //Gives the HTML document of the page.
      

      获取标签的所有元素:

      //HTML element's tag name:
      IHTMLElementCollection AnchorColl = body.getElementsByTagName("a");
      

      并为该标签的所有元素解析AnchorColl

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        相关资源
        最近更新 更多