【问题标题】:selenium get page source different with right click in browserselenium 在浏览器中右键单击获取不同的页面源
【发布时间】:2014-04-23 05:17:47
【问题描述】:

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

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

我很确定这与我请求的网址相同...

【问题讨论】:

  • 标签的顺序和hrefs的大小写实际上并不重要。你关心它的原因是什么?
  • @alecxe 因为我必须解析 html,所以在使用 selenium 并将页面源保存到文件时它的工作方式不同。
  • 如果您需要解析它,那么正如@alecxe 所说,没关系。如果您的解析器有问题,那么这是一个大问题,请切换到其他解析器。

标签: javascript jquery python-2.7 selenium


【解决方案1】:

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

  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 中没有排序。 (元素以及标记元素开始和结束的标签是有序的。所以&lt;a&gt;&lt;b&gt;&lt;b&gt;&lt;a&gt; 不同。)由于序列化程序处理间距的方式,可能会出现其他差异。名称的大小写也可能不同:&lt;TABLE&gt;&lt;table&gt; 是等价的。这是因为 HTML 不区分大小写(XHTML 区分大小写。)

    不能保证 Selenium 和 Firefox 的保存菜单会使用完全相同的序列化程序和完全相同的配置。所以这两种方法得到的结果可能会有所不同。

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

【讨论】:

    猜你喜欢
    • 2018-08-12
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2021-09-10
    相关资源
    最近更新 更多