selenium在浏览器中右键单击获取页面源

时间:2014-03-17 19:44:40

标签: 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">

我很确定它与我要求的网址相同......

1 个答案:

答案 0 :(得分:4)

在获取网页源方面,有两个主要问题正在发挥作用。

  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">
    

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

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

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