[英]Screen Scraping, Web Scraping, Web Harvesting, Web Data Extraction, etc. using C# and the .NET Framework
我正在使用Microsoft .NET Application in C#
开发Microsoft .NET Application in C#
用于 Web 收集、Web 抓取、Web 数据提取、屏幕抓取等。无论您想怎么称呼它。 为了解析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
。
当您引用浏览器窗口时,您可能没有完成页面加载。 您可以让浏览器控件在完成后触发导航完成事件。 请参阅此 SO 答案以获取示例: C# 如何在继续之前等待网页完成加载
我不熟悉HTMLAgilityPack
但我过去使用过的一个组件是SGMLReader
: http : //developer.mindtouch.com/SgmlReader 。 它的功能类似于XMLReader
替代品,如果需要,甚至可以为您将文档转换为 XML。 您可以将其加载到XMLDocument
(甚至是XDocument
)中,然后由您决定如何处理它。
所以我建议使用HTTPWebRequest
来获取 HTML,然后将 HTML 加载到这个组件中。 这样你就不需要靠近WebBrowser
控件。
对于屏幕抓取,如果您正在搜索特定的图像/形状,您可以使用:
您还read
使用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;
}
解析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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.