我在解析网页时遇到问题,因为我在解析时得到了不同的页面源:
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 相同...
最佳答案
像您这样获取网页的来源有两个主要问题。
虽然我们使用 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。如今,网页最初并不包含它需要的所有元素的情况并不少见。其中一些元素是在初始页面加载完成后不久加载的。如果您从
driver.page_source
保存页面在页面初始加载但之前 Ajax 有机会加载附加元素,然后您使用 Firefox 的菜单手动保存页面,很可能存在一些差异会发生因为driver.page_source
遗漏了通过 Ajax 加载的元素。
关于javascript - selenium 在浏览器中右键单击获取页面源不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22463894/