我在解析网页时遇到问题,因为这样做时我得到了不同的页面源:
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。如今,网页并非一开始就包含它需要的所有元素,这已经很普遍了。其中一些元素在初始页面完成加载后不久就会加载。如果从保存页面driver.page_source
后,在页面初始加载,但前阿贾克斯有机会来加载额外的元素,然后手动保存使用Firefox的菜单页面,有机会,一定的差异会发生,因为driver.page_source
缺失的元素加载通过阿贾克斯
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句