javascript - selenium 在浏览器中右键单击获取页面源不同

标签 javascript jquery python-2.7 selenium

我在解析网页时遇到问题,因为我在解析时得到了不同的页面源:

display = Display(visible=False, size=(800, 600), backend='xvfb')
display.start()
driver = webdriver.Firefox()
url = "http://www.aaa.com"
driver.get(url)
with codecs.open('page.html', 'w', 'utf-8') as f:
    f.write(driver.page_source)

当我打开文件查看实际文本时,它与我在浏览器中右键单击所看到的不同。

例如,某些 href 变为小写。 以及页面源代码中的一些标签:

<table class="list" boroder="0" id="list_id">

变成了

<table border="0" id="list_id" class="list">

我很确定它与我请求的 url 相同...

最佳答案

像您这样获取网页的来源有两个主要问题。

  1. 虽然我们使用 HTML 描述网页,但浏览器并不直接使用 HTML。他们将 HTML 转换为称为 DOM 树的内部表示。什么driver.page_source将文件的源文件保存到磁盘所做的就是在称为序列化的过程中将此 DOM 树转换回 HTML。两个序列化器,或与两种不同配置一起使用的单个序列化器,可以序列化相同 DOM 树不同。您遇到过这样的情况:

    <table class="list" border="0" id="list_id">
    

    对比

    <table border="0" id="list_id" class="list">
    

    在上面的两个实例中,属性的顺序是不同的。但是,这并不重要,因为 属性 在 HTML 中没有排序。 (元素以及标记元素开始和结束的标签是有序的。因此 <a><b><b><a> 不同。)由于序列化程序处理间距的方式,可能会出现其他差异。名称的大小写也可能不同:<TABLE><table>是等价的。这是因为 HTML 不区分大小写(XHTML 区分大小写。)

    无法保证 Selenium 和 Firefox 的保存菜单将使用具有完全相同配置的完全相同的序列化程序。因此,您从这两种方法中获得的结果可能存在差异。

  2. 可能会给您带来麻烦的另一件事是 Ajax。如今,网页最初并不包含它需要的所有元素的情况并不少见。其中一些元素是在初始页面加载完成后不久加载的。如果您从 driver.page_source 保存页面页面初始加载但之前 Ajax 有机会加载附加元素,然后您使用 Firefox 的菜单手动保存页面,很可能存在一些差异会发生因为driver.page_source遗漏了通过 Ajax 加载的元素。

关于javascript - selenium 在浏览器中右键单击获取页面源不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22463894/

相关文章:

javascript - 奇怪的 jQuery 错误消息

javascript - 自定义验证作为 Angular 中的函数

javascript - extjs 3.4 如何动态添加复选框到工具栏

jquery - JQGrid colModel 和数据的动态填充

javascript - 如何判断加载的是哪个页面?

javascript - 我可以将每个元素用于动态创建的元素吗?

python - 重采样错误 : cannot reindex a non-unique index with a method or limit

javascript - 如何防止图像动画穿过我的整个屏幕而不仅仅是我的容器?

python - 如何在 Python 中将变量设为 'raw text'?

python - 如何将整个 python 空闲命令历史记录打印到文本文件