如何利用WebBrowser控件获取解析javascript后的html源代码?

时间:2022-11-23 10:14:12
    我试过使用 IHTMLDocument3的get_documentElement方法获取一个根节点docElem,然后通过IHTMLElement接口的get_innerHTML方法获取html源代码,无法获取到解析javascript后的源代码,例如新浪博客的评论无法获取。
    然而使用 IHTMLDocument2接口的get_body方法获取到的bodyElem,再使用get_innerHTML方法就能获取解析javascript后的源代码。但是这样以来只能获取BODY标签内的源代码,无法保证HTML源代码的完整性。
    如何获取完整且解析javascript之后的HTML源代码?麻烦提供个思路。
    

8 个解决方案

#1


documentElement的innerHTML获取的是初始代码,不包括运行期的改变,无论DOM怎样变化,“查看网页源码”操作显示的始终是最开始打开的页面。

head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。

#2


引用 1 楼 jameshooo 的回复:
documentElement的innerHTML获取的是初始代码,不包括运行期的改变,无论DOM怎样变化,“查看网页源码”操作显示的始终是最开始打开的页面。 

head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。

十分感谢!
那通过什么方法可以获取动态运行后的完整HTML源码呢?

#3


我的观点很明确,没有方法能做到。
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子:
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复杂的东西(例如设置表达式)根本不可能反向转换。

你应该改变需求,别指望能获得完整的HTML,应该关注某个具体的DOM对象或属性。

#4


引用 3 楼 jameshooo 的回复:
我的观点很明确,没有方法能做到。 
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子: 
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复…

十分感谢你的回答。
不好意思,之前我理解上有点错误。

#5


MARK

#6


学习了.

#7


mark

#8


jameshooo,你纯粹在误人子弟,我都已经拿到了内容了
IHTMLElement *body;
pHTMLDocument->get_body(&body);

CString sHtml;
if (body)

BSTR bs;
HRESULT h = body->get_innerHTML(&bs);
if (h != S_OK)

MessageBox(L"Error");
}
else

//sHtml = _com_util::ConvertBSTRToString( bs );
}
}
这样拿到的就是javascript执行之后的页面内容。
这个垃圾坛子他妈的越来越多滥竽充数,还振振有词的假牛,从不回复技术帖子,实在是觉得误人子弟才回复

#1


documentElement的innerHTML获取的是初始代码,不包括运行期的改变,无论DOM怎样变化,“查看网页源码”操作显示的始终是最开始打开的页面。

head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。

#2


引用 1 楼 jameshooo 的回复:
documentElement的innerHTML获取的是初始代码,不包括运行期的改变,无论DOM怎样变化,“查看网页源码”操作显示的始终是最开始打开的页面。 

head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。

十分感谢!
那通过什么方法可以获取动态运行后的完整HTML源码呢?

#3


我的观点很明确,没有方法能做到。
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子:
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复杂的东西(例如设置表达式)根本不可能反向转换。

你应该改变需求,别指望能获得完整的HTML,应该关注某个具体的DOM对象或属性。

#4


引用 3 楼 jameshooo 的回复:
我的观点很明确,没有方法能做到。 
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子: 
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复…

十分感谢你的回答。
不好意思,之前我理解上有点错误。

#5


MARK

#6


学习了.

#7


mark

#8


jameshooo,你纯粹在误人子弟,我都已经拿到了内容了
IHTMLElement *body;
pHTMLDocument->get_body(&body);

CString sHtml;
if (body)

BSTR bs;
HRESULT h = body->get_innerHTML(&bs);
if (h != S_OK)

MessageBox(L"Error");
}
else

//sHtml = _com_util::ConvertBSTRToString( bs );
}
}
这样拿到的就是javascript执行之后的页面内容。
这个垃圾坛子他妈的越来越多滥竽充数,还振振有词的假牛,从不回复技术帖子,实在是觉得误人子弟才回复