Web浏览器中动态添加修改HTML页面代码的问题分析
来源:互联网 发布:linux 修改用户字符集 编辑:程序博客网 时间:2024/05/19 05:34
引言:在Web的世界里,浏览器加载页面,展示给用户最终的内容,可是最终展示的HTML代码与服务器上存储的代码一致吗?
1. xpath为什么不能正常工作?
XPath是用来快速定位页面元素的方式和方法,忽然有一天,发现在页面中截取的XPath在代码的匹配中是无法工作的,那问题出在哪里呢?
页面地址:http://www.66ip.cn/
截取匹配页面中的IP地址,基于Chrome浏览器自带的开发者工具,我们截取到某一个匹配的XPath路径为:
//*[@id="main"]/div/div[1]/table/tbody/tr[2]接下来,需要在代码中使用该xpath来匹配这个路径内容:
from lxml import etreefrom randomurl = "http://www.66ip.cn"pattern = '//*[@id="main"]/div/div[1]/table/tbody/tr'r = requests.get(url)tree = etree.HTML(r.text)nodes = tree.xpath(pattern)print("node length: %s" % len(nodes))期望应该可以匹配出实际的tr元素个数的,但是实际的情况是nodes的长度为0, 那问题出在哪里呢?
2. 问题分析
首先怀疑是否是XPath有问题,仔细检查了一边提取过程,没有问题。
难道读取的页面内容和实际在浏览器中看到的内容不一致吗,网站是否有做其他的处理? 按照这个思路,提取了一下响应的内容:
提取响应对象中的text属性,r.text中的内容,查看其中的内容,发现其中是有期望匹配的内容的,但是为什么不能匹配成功呢?
可能的答案只有2个: 要么xpath有问题,要么响应的文件与浏览器中的内容不一致?
xpath的提取是由浏览器自身来提取的,所以应该没有问题,那只能是浏览器中看到的内容与实际在代码中响应的内容不一致,那就对比一下内容吧,对比一下有了发现:
在浏览器中的页面片段:
<table width="100%" border="2px" cellspacing="0px" bordercolor="#6699ff"> <tbody><tr><td>ip</td><td>端口号</td><td>代理位置</td><td>代理类型</td><td>验证时间</td></tr> ..... </tbody> </table>在代码中实际获取的代码片段如下:
<table width="100%" border="2px" cellspacing="0px" bordercolor="#6699ff"> <tr><td>ip</td><td>端口号</td><td>代理位置</td><td>代理类型</td><td>验证时间</td></tr> ......</table>不同之处是<tbody>在实际的代码中是不存在,只是在浏览器展示的过程中,浏览器自行添加上去的,结果导致提取的XPath路径与实际的代码无法匹配,最终无法获取到正确的匹配结果。
3.问题解决
修改xpath的路径,将tbody移除掉之后,重新执行代码即可正确内容了。
4. 延展分析
为了简化这个问题,做另一个简单的HTML页面,在浏览器上查看起显示的代码:
编辑器中的HMTL代码:
<html> <head> <title>hell world</title> </head> <body> <table> <tr> <td>who like it</td><td>No one really Care.</td> <td>Sky Net</td><td>helloworld</td> </tr> <tfoot>abce</tfoot> </table> </body></html>浏览器中的显示效果:
可以看到在浏览器中,自行添加了tbody的子标签,包装tr的内容;tfoot的内容跑到了上面去了,而tfoot的内容为空。是不是非常的诡异呀?
上述代码在Firefox/Chrome中测试过,情况相同,应该是浏览器执行的处理标准。
5.总结
浏览器为了更好的展示来自服务器的HMTL代码,自行做了相应的调整,在进行页面的代码分析之时,需要注意某些标签其实是浏览器在解析执行代码之时,自行添加上取的,不是实际的页面内容。
- Web浏览器中动态添加修改HTML页面代码的问题分析
- 动态添加修改WEB.CONFIG的具体代码方法
- 动态修改页面导航的问题!(sitemappath + web.sitemap)
- 在页面中动态添加HTML
- j2ee的web项目,在浏览器中发起一个该项目中html页面的绝对地址,也是发起的一个http url请求,请求的响应报文的结果就是该html页面的所有html代码
- 动态添加HTML标签中单引号,双引号的嵌套问题
- 求助:在aspx页面中动态添加CheckBox的问题
- ASP.NET程序中动态修改web.config中的设置项目(前台页面代码)
- [Javascript]在HTML页面中动态添加表格,动态生成行的示例
- Jquery 修改 动态生成的Html代码
- 在WEB页面上用代码动态添加DataGrid
- 关于代码中动态添加viewpager报错的问题
- html页面动态添加控件
- dom动态修改html页面
- 接上一篇,在cs文件中往页面动态添加meta标签时出现“控件包含代码块(即 ),因此无法修改控件集合”错误的解决方法
- 1j2ee即web项目,严格意义上来说,没有jsp代码,只有class文件、html文件、javascript文件。2 基于extjs框架的项目怎么怎么查看在浏览器中展示的最终html页面的代码 3
- 【前端技巧】html右键禁用和web页面中添加加入qq群的方式
- html的form中动态添加action
- 卷积神经网络Lenet-5实现
- 函数的参数拓展
- CCFCSP201509-1数列分段
- C++ typedef typename 作用
- Tensorflow cnn网络 vgg可视化
- Web浏览器中动态添加修改HTML页面代码的问题分析
- Android 多渠道定制化打包
- H264编码基本原理以及I帧B帧P帧的概念
- Java中synchronized的实现原理与应用
- 内联函数定义相关问题
- 二叉树的层次遍历
- Hibernate基本用法:Configuration对象
- 调试神经网络的技巧
- JAVA IO 以及 NIO 理解