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变成小写。 页面源中的一些标记:

 

转换成

 

我很确定这是我要求的相同url…

在获取网页源代码方面有两个主要问题。

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

     

 

在上面的两个实例中,属性的顺序是不同的。 但是,这并不重要,因为属性不是以HTML格式排序的。 (元素和标记元素开始和结束的标记是有序的。因此不同。)由于序列化器处理间距的方式,可能会出现其他差异。 名称的大小写也可能不同:

是等效的。 这是因为HTML不区分大小写(XHTML区分大小写。)

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

  • 另一件可能导致您麻烦的事情是Ajax。 现在,网页最初并不包含它需要的所有元素,这种情况并不罕见。 在初始页面加载完成后不久加载其中一些元素。 如果在页面初始加载之后但 Ajax有机会加载其他元素之前driver.page_source保存页面,然后使用Firefox的菜单手动保存页面,则可能会因为driver.page_source而出现一些差异driver.page_source错过了通过Ajax加载的元素。