然而使用 IHTMLDocument2接口的get_body方法获取到的bodyElem,再使用get_innerHTML方法就能获取解析javascript后的源代码。但是这样以来只能获取BODY标签内的源代码,无法保证HTML源代码的完整性。
如何获取完整且解析javascript之后的HTML源代码?麻烦提供个思路。
8 个解决方案
#1
documentElement的innerHTML获取的是初始代码,不包括运行期的改变,无论DOM怎样变化,“查看网页源码”操作显示的始终是最开始打开的页面。
head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。
head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。
#2
十分感谢!
那通过什么方法可以获取动态运行后的完整HTML源码呢?
#3
我的观点很明确,没有方法能做到。
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子:
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复杂的东西(例如设置表达式)根本不可能反向转换。
你应该改变需求,别指望能获得完整的HTML,应该关注某个具体的DOM对象或属性。
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子:
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复杂的东西(例如设置表达式)根本不可能反向转换。
你应该改变需求,别指望能获得完整的HTML,应该关注某个具体的DOM对象或属性。
#4
十分感谢你的回答。
不好意思,之前我理解上有点错误。
#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执行之后的页面内容。
这个垃圾坛子他妈的越来越多滥竽充数,还振振有词的假牛,从不回复技术帖子,实在是觉得误人子弟才回复
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导航来检测具体的属性值。
head标签比较特殊,作用像一个预处理的静态环境,虽然运行期它的局部内容可以改变,但是无法通过innerHTML获得改变的内容,只能通过DOM导航来检测具体的属性值。
#2
十分感谢!
那通过什么方法可以获取动态运行后的完整HTML源码呢?
#3
我的观点很明确,没有方法能做到。
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子:
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复杂的东西(例如设置表达式)根本不可能反向转换。
你应该改变需求,别指望能获得完整的HTML,应该关注某个具体的DOM对象或属性。
这并不是微软故意做的限制,而是因为不是所有的东西都能做DOM逆向转换。例如CSS、JS都是不能逆向转换回字符串的。举个简单例子:
假设CSS中有一个width属性描述为 200px,或者 200em,这两种描述使用的单位不一样,在解析成DOM时会根据当前DC环境转换成内部的像素数值,然后通过DOM操作改变了这个内部数值,现在想转换回CSS描述,你说应该转换到px还是em?这只是最简单的一种情况,还有更复杂的东西(例如设置表达式)根本不可能反向转换。
你应该改变需求,别指望能获得完整的HTML,应该关注某个具体的DOM对象或属性。
#4
十分感谢你的回答。
不好意思,之前我理解上有点错误。
#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执行之后的页面内容。
这个垃圾坛子他妈的越来越多滥竽充数,还振振有词的假牛,从不回复技术帖子,实在是觉得误人子弟才回复
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执行之后的页面内容。
这个垃圾坛子他妈的越来越多滥竽充数,还振振有词的假牛,从不回复技术帖子,实在是觉得误人子弟才回复