在最近的数据采集研究中, 发现很多页面的内容都是在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#脚本代码采集搜狐NBA球员, 球队和比赛实况

C#中利用JQuery实现视频网站的缩略图采集

API - 使用Default对象 - 基础篇

示例 - 如何翻页

示例 - 向百度说 Hello world! 并获得回应.

Spider Studio 社区信息

C#代码获取或设置Iframe中的HTML的更多相关文章

  1. 利用Jquery获取、设置iframe中元素

    <iframe id="iframe" src="'+url+'"></iframe>'; //iframe加载完成后 $(" ...

  2. 获取和设置iframe中的元素

    http://www.cnblogs.com/gao-qiang/archive/2012/09/19/2694336.html http://java-my-life.iteye.com/blog/ ...

  3. Android中通过代码获取arrays.xml文件中的数据

    android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组.整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过 ...

  4. Jq如何获取并操作iframe中的元素?

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. [Selenium] Java代码获取,设置屏幕分辨率

    import java.awt.Dimension; import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java. ...

  6. 在iframe中获取另一个iframe中的元素

    $(top.parent.iframeId).contents().find("#selector") //iframeId为iframe的id名称

  7. javascript获取和设置URL中的参数

    勘误版 function getQuery(key, url) { url = url || window.location.href; if (url.indexOf('#') !== -1) ur ...

  8. JS中获取和操作iframe

    一.需求与遇到的问题 在网站的后台管理中使用了iframe框架布局,包括顶部菜单.左侧导航和主页面.需求是:点击主页面上的一个按钮,在顶部菜单栏的右侧显示“退出”链接,点击可退出系统. 我的思路是:在 ...

  9. 关于如何获取iframe中的元素

    今天研究了一下iframe中元素的获取,发现有些地方还是有点坑的. 首先:如果使用纯前端手段,是没有办法获取非同源的iframe中的元素的,后面会提到后端手段 一.同源环境 1.首先在父页面获取ifr ...

随机推荐

  1. 关于使用jquery时,ie8下提示对象不支持的属性或方法的解决办法

    转自:http://wapapp.baidu.com/auoong/item/538790fcbe87c834d7ff8cde 首先这个问题的前提是已经排除了常见的这个问题.下面说一种今天我碰到的一种 ...

  2. 六个前端开发工程师必备的Web设计模式/模块资源

    Yahoo的设计模式库 Yahoo的设计模式库包含了很多可以帮助开发设计人员解决遇到的问题的资源,包括开发中常常需要处理的导航,互动效果及其布局网格等大家常用的组件和模块 响应式设计模式库 这个响应式 ...

  3. 使用Loader实时查询本地数据库用法

    在看Android的文档时,看到了这么一个东西: Loader 究竟是什么东西呢? Introduced in Android 3.0, loaders make it easy to asynchr ...

  4. android DPI与分辨率的关系及计算方式

    android DPI与分辨率的关系及计算方式   Low   density (120), ldpi Medium   density (160), mdpi High   density (240 ...

  5. 【Leet Code】String to Integer (atoi) ——常考类型题

    String to Integer (atoi) Total Accepted: 15482 Total Submissions: 106043My Submissions Implement ato ...

  6. HTTP 协议 Cache-Control 头——性能啊

    原文地址:http://tools.ietf.org/html/rfc2616#section-14.9 本文内容 概述术语HTTP Cache-Control 头    可缓存的资源    可被高速 ...

  7. Linux命令-权限管理命令:chgrp

    groupadd shuaige 创建一个用户组名字叫shuaige ls -l /home/wangyunpeng/abcd 查看abcd文件的权限 chgrp shuaige /home/wang ...

  8. android的通知栏的实现

    package com.example.mynotification; import android.os.Bundle; import android.app.Activity; import an ...

  9. 零基础学python-5.4 数字精度与复数

    1.整数精度 这里我们对照一下python2.7与python3.4的整数精度 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/ ...

  10. Mysql 字符串函数 详解

    字符串函数是最常用的一种函数了,如果大家编写过程序的话,不妨回过头去看看自己使用过的函数,可能会惊讶地发现字符串处理的相关函数占已使用过的函数很大一部分.MySQL中字符串函数也是最丰富的一类函数,表 ...