我在解析网页时遇到问题,因为当我这样做时,我得到了不同的页面来源:
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菜单手动保存页面,则可能会因为驱动程序而出现一些差异. page_source错过了通过Ajax加载的元素.
原文地址:https://codeday.me/bug/20190624/1279577.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。