C#代码获取或设置Iframe中的HTML
在最近的数据采集研究中, 发现很多页面的内容都是在iframe中的, 这位采集带来了不少困难. 经过一番思考之后, 我想到了C#的解决办法:
1. 运行Spider Studio, 加载页面 http://www.w3school.com.cn/tiy/t.asp?f=html_iframe
2. 编辑代码, 将iframe指向 http://www.w3school.com.cn

3. 这个页面具备如下结构:
Page > IFrame1 -> IFrame2 (就是我们代码中写的那个IFrame)
我的目标是通过C#代码先获取IFrame1的内容, 然后继续获取IFrame2的内容, 继而设置IFrame2的src到 GDT首页 去.
4. 获取IFrame1
var iframe1 = Default.SelectSingleNode("#result iframe").Contents().SelectSingleNode("body");
if(iframe1.IsEmpty() == false)
{
MessageBox.Show(iframe1.Html());
}
此时显示结果正确, 证明成功取到了IFrame1的内容:

5. 获取IFrame2
var iframe2 = Default.SelectSingleNode("#result iframe").Contents().SelectSingleNode("iframe").Contents().SelectSingleNode("body");
if(iframe2.IsEmpty() == false)
{
MessageBox.Show(iframe2.Html());
}
此时显示结果正确, 证明也成功取到IFrame2的内容了:

6. 设置IFrame2的Src
iframe2 = Default.SelectSingleNode("#result iframe").Contents().SelectSingleNode("iframe"); //重新定位iframe2到IFrame元素上
iframe2.Attr("src", "http://www.gdtsearch.com");
此时IFrame2已经跳转, 结果正确!

7. 全部预期功能实现, 现在所说已知的局限性:
7.1 不兼容跨域访问
如果iframe中的页面和父页面不在一个域名下面, 这段代码因为安全性的原因是失效的. 比如我将iframe2的src换成 http://www.gdtsearch.com, 那么相应的取iframe2.Body的时候就会报错:

7.2 判断IFrame中页面何时加载完成的代码逻辑有点复杂, 我写了一个方法供大家参考:
public void IFrameReady(JQueryContext iframe, string jQueryExpr)
{
while(Default.Available)
{
var contents = iframe.Contents();
if(contents.IsEmpty() == false)
{
var node = contents.SelectSingleNode(jQueryExpr);
if(node.IsEmpty() == false && node.Html().Trim().Length > )
{
return;
}
}
Thread.Sleep();
Application.DoEvents();
}
}
8. 和Spider Studio采集以及相关脚本编写的其他文章:
C#代码获取或设置Iframe中的HTML的更多相关文章
- 利用Jquery获取、设置iframe中元素
<iframe id="iframe" src="'+url+'"></iframe>'; //iframe加载完成后 $(" ...
- 获取和设置iframe中的元素
http://www.cnblogs.com/gao-qiang/archive/2012/09/19/2694336.html http://java-my-life.iteye.com/blog/ ...
- Android中通过代码获取arrays.xml文件中的数据
android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组.整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过 ...
- Jq如何获取并操作iframe中的元素?
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- [Selenium] Java代码获取,设置屏幕分辨率
import java.awt.Dimension; import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java. ...
- 在iframe中获取另一个iframe中的元素
$(top.parent.iframeId).contents().find("#selector") //iframeId为iframe的id名称
- javascript获取和设置URL中的参数
勘误版 function getQuery(key, url) { url = url || window.location.href; if (url.indexOf('#') !== -1) ur ...
- JS中获取和操作iframe
一.需求与遇到的问题 在网站的后台管理中使用了iframe框架布局,包括顶部菜单.左侧导航和主页面.需求是:点击主页面上的一个按钮,在顶部菜单栏的右侧显示“退出”链接,点击可退出系统. 我的思路是:在 ...
- 关于如何获取iframe中的元素
今天研究了一下iframe中元素的获取,发现有些地方还是有点坑的. 首先:如果使用纯前端手段,是没有办法获取非同源的iframe中的元素的,后面会提到后端手段 一.同源环境 1.首先在父页面获取ifr ...
随机推荐
- Tensorflow 深度学习简介(自用)
一些废话,也可能不是废话.可能对,也可能不对. 机器学习的定义:如果一个程序可以在任务T上,随着经验E的增加,效果P也可以随之增加,则称这个程序可以在经验中学习. “程序”指的是需要用到的机器学习算法 ...
- Android选择/拍照 剪裁 base64/16进制/byte上传图片+PHP接收图片
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/65633129认为博文实用,请点赞,请评论,请关注.谢谢! ~ 老规矩,先上GIF动态图 ...
- 用Sass创建MetaFizzy效果
来源:GBin1.com Hugo发现了一个绚丽的css效果应用于web中并教会你如何聪明的重建和使用它.两天前,我看见笔者Hugo在css帮助下重写MetaFizzy的效果,Hugo帮助我们找到了一 ...
- sql分页性能测试结果
--方案一: declare @d datetime set @d = getdate() ID from Info order by ID) order by ID select [not in方法 ...
- CSS基础和布局复习
table布局 div布局优势 浏览器支持完善 表现和结构分离 样式设计控制功能强大 可以继承,层叠处理 Transitional // 松散过度型 Strict //严格型 Fram ...
- GIL线程全局锁 协程
GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务 ...
- vue常用属性解释。
props:详看 示例-网格组件. props 可以是数组或对象,用于接收来自父组件的数据.props 可以是简单的数组,或者使用对象作为替代,对象允许配置高级选项,如类型检测.自定义校验和设置默认值 ...
- ReSharper的功能真的很强大主要是针对代码规范和优化,园子里介绍的也不少,如果你没有安装,那我只能表示你们会相见恨晚
二.ReSHarper 代码规范.单元测试.... ReSharper的功能真的很强大,主要是针对代码规范和优化,园子里介绍的也不少,如果你没有安装,那我只能表示你们会相见恨晚! 1.像命名不规范,f ...
- SQL语言基本操作(聚合函数)
一.聚合函数 1.标量函数:只能对单个的数字或值进行计算.主要包括字符函数.日期/时间函数.数值函数和转换函数这四类.如LEFT/RIGHT/SUBSTRING/LTRIM/RTRIM/CONCAT/ ...
- 【小程序】微信小程序之地图功能
转载请注明出处:http://blog.csdn.net/crazy1235/article/details/55004841 基本使用 地图组件使用起来也很简单. .wxml <map id= ...