我在解析网页时遇到问题,因为我在执行以下操作时获得了不同的页面源:

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

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

最佳答案

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

  • 尽管我们使用 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 的保存菜单将使用完全相同的序列化程序和完全相同的配置。因此,您从两种方法中获得的结果可能存在差异。
  • 另一个可能给您带来麻烦的事情是 Ajax。如今,网页最初不包含它需要的所有元素的情况并不少见。其中一些元素在初始页面完成加载后不久加载。如果您在页面初始加载后但在 Ajax 有机会加载其他元素之前从 driver.page_source 保存页面,然后您使用 Firefox 的菜单手动保存页面,则可能会出现一些差异,因为 driver.page_source 缺少元素通过 Ajax 加载。
  • 关于javascript - selenium 通过在浏览器中右键单击获取不同的页面源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22463894/

    10-16 18:07