从 CefSharp 网络浏览器获取 HTML 源代码
Posted
技术标签:
【中文标题】从 CefSharp 网络浏览器获取 HTML 源代码【英文标题】:Get HTML source code from CefSharp web browser 【发布时间】:2016-06-23 18:06:58 【问题描述】:我正在使用 aCefSharp.Wpf.ChromiumWebBrowser(版本 47.0.3.0)来加载网页。页面加载后的某个时间点我想获取源代码。
我打过电话:
wb.GetBrowser().MainFrame.GetSourceAsync()
但是它似乎没有返回所有源代码(我相信这是因为有子框架)。
如果我打电话:
wb.GetBrowser().MainFrame.ViewSource()
我可以看到它列出了所有的源代码(包括内部框架)。
我希望得到与 ViewSource() 相同的结果。请有人指出我正确的方向吗?
更新 - 添加代码示例
注意:Web 浏览器指向的地址也只能在 2016 年 10 月 3 日之前(包括 10/03/2016)有效。之后它可能会显示不同的数据,这不是我会看到的。
在 frmSelection.xaml 文件中
<cefSharp:ChromiumWebBrowser Name="wb" Grid.Column="1" Grid.Row="0" />
在 frmSelection.xaml.cs 文件中
public partial class frmSelection : UserControl
private System.Windows.Threading.DispatcherTimer wbTimer = new System.Windows.Threading.DispatcherTimer();
public frmSelection()
InitializeComponent();
// This timer will start when a web page has been loaded.
// It will wait 4 seconds and then call wbTimer_Tick which
// will then see if data can be extracted from the web page.
wbTimer.Interval = new TimeSpan(0, 0, 4);
wbTimer.Tick += new EventHandler(wbTimer_Tick);
wb.Address = "http://www.racingpost.com/horses2/cards/card.sd?race_id=644222&r_date=2016-03-10#raceTabs=sc_";
wb.FrameLoadEnd += new EventHandler<CefSharp.FrameLoadEndEventArgs>(wb_FrameLoadEnd);
void wb_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
if (wbTimer.IsEnabled)
wbTimer.Stop();
wbTimer.Start();
void wbTimer_Tick(object sender, EventArgs e)
wbTimer.Stop();
string html = GetHTMLFromWebBrowser();
private string GetHTMLFromWebBrowser()
// call the ViewSource method which will open up notepad and display the html.
// this is just so I can compare it to the html returned in GetSourceAsync()
// This is displaying all the html code (including child frames)
wb.GetBrowser().MainFrame.ViewSource();
// Get the html source code from the main Frame.
// This is displaying only code in the main frame and not any child frames of it.
Task<String> taskHtml = wb.GetBrowser().MainFrame.GetSourceAsync();
string response = taskHtml.Result;
return response;
【问题讨论】:
你能再分享一些代码吗?我无法重现您的问题,GetSourceAsync
与ViewSource
得到相同的文本。尝试将Address
设置为http://***.com
(它有两个框架,一个iframe
和主框架)
感谢您的浏览。我已在原始帖子中添加了示例源代码。
【参考方案1】:
我认为我不太明白这个DispatcherTimer
解决方案。我会这样做:
public frmSelection()
InitializeComponent();
wb.FrameLoadEnd += WebBrowserFrameLoadEnded;
wb.Address = "http://www.racingpost.com/horses2/cards/card.sd?race_id=644222&r_date=2016-03-10#raceTabs=sc_";
private void WebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e)
if (e.Frame.IsMain)
wb.ViewSource();
wb.GetSourceAsync().ContinueWith(taskHtml =>
var html = taskHtml.Result;
);
我对@987654323@ 的输出和html
变量中的文本进行了比较,它们是相同的,所以我无法在这里重现您的问题。
这就是说,我注意到主框架加载得很晚,所以你必须等待很长一段时间,直到记事本与源代码一起弹出。
【讨论】:
感谢您对我的代码的反馈,我已经对其进行了更新以反映您的示例。自从发布示例以来,我已经在另一台计算机上运行了代码,并且得到了与您相同的结果(都返回了完整的源代码)。我只能得出结论,我的机器发生了一些奇怪的事情,我会考虑做一个格式化。【参考方案2】:我在尝试点击位于框架而不是主框架上的项目时遇到了同样的问题。使用您回答中的示例,我编写了以下扩展方法:
public static IFrame GetFrame(this ChromiumWebBrowser browser, string FrameName)
IFrame frame = null;
var identifiers = browser.GetBrowser().GetFrameIdentifiers();
foreach (var i in identifiers)
frame = browser.GetBrowser().GetFrame(i);
if (frame.Name == FrameName)
return frame;
return null;
如果您的表单上有包含此方法的模块的“使用”,您可以执行以下操作:
var frame = browser.GetFrame("nameofframe");
if (frame != null)
string HTML = await frame.GetSourceAsync();
当然在使用这个之前你需要确保页面加载完成,但是我打算经常使用它。希望对您有所帮助!
吉姆
【讨论】:
【参考方案3】:CefSharp with this Code with source code 你可以拿
public ChromiumWebBrowser syhmhfzdrv;
async Task<string> Bekraanlizying()
string syhmhfzhtml = await syhmhfzdrv.GetSourceAsync();
return syhmhfzhtml;
从 iframe 获取此代码的源代码
async Task<string> syhmhfziframesourcecode()
string syhmhfzHtml = "";
var identifiers = drv.GetBrowser().GetFrameIdentifiers();
foreach (var i in identifiers)
IFrame frame = drv.GetBrowser().GetFrame(i);
if (frame.Name == "frmMain")//Write the name iframe..
syhmhfzHtml = await frame.GetSourceAsync();
return syhmhfzHtml;
【讨论】:
以上是关于从 CefSharp 网络浏览器获取 HTML 源代码的主要内容,如果未能解决你的问题,请参考以下文章
CefSharp 从现有的 Javascript 函数中获取结果
CefSharp.ChromiumWebBrowser浏览器的一些常用功能使用记录