将html保存为文本
我有一段JavaScript代码,它可以显示一个网页的源代码。
javascript:h=document.getElementsByTagName('html')[0].innerHTML;function%20disp(h){h=h.replace(/</g,%20'\n<');h=h.replace(/>/g,'>');document.getElementsByTagName('body')[0].innerHTML='<pre><html>'+h.replace(/(\n|\r)+/g,'\n')+'</html></pre>';}void(disp(h));
我把这段代码保存为Firefox的书签。这样在加载一个网页后,当我从书签中选择这段代码时,它就会显示出源代码。
现在我想用Python来保存这个HTML文件。
from BeautifulSoup import BeautifulSoup
from BeautifulSoup import BeautifulStoneSoup
import BeautifulSoup
import urllib2
from BeautifulSoup import BeautifulSoup
page = urllib2.urlopen("http://www.doctorisin.net/")
soup = BeautifulSoup(page)
print soup.prettify()
fp = open('file.txt','wb')
fp.write(soup.prettify())
但是保存下来的文件和JavaScript显示的源代码不一样。可能是因为Python的代码没有从网页中获取到所有的内容(比如JavaScript和CSS的代码)。这是什么问题呢?我是不是做错了什么?需要帮助。
谢谢。
编辑
举个例子来说明我的问题,http://phpjunkyard.com/tutorials/cut-paste-code.php(随便找的一个网站)去这个网站,右键点击选择查看页面源代码(在Firefox中),然后复制源代码并保存到一个文本文件中。接着再选择保存页面(另存为)。你会发现这两者并不相同。保存的页面(另存为)多了一些东西。而Python输出的结果就像查看页面源代码那样,缺少了一些脚本、表单等内容。
2 个回答
你看到的其实是静态网页和动态网页之间的区别。
静态网页和动态网页不一样,动态网页在加载的时候可以修改底层的html。JavaScript可以获取加载页面的完整html,因为它可以访问浏览器创建的修改过的DOM。
相反,如果同样的网页是从服务器下载下来的,然后直接给BeautifulSoup
处理,它只能把它当作静态html来解析。要获取完整的动态内容,这个页面需要先通过浏览器(或者类似的工具)处理。
如果你想保存网页服务器给你的完整HTML代码,不要使用BeautifulSoup
(这是一个用来解析HTML的工具,它在处理代码时可能会修改原来的格式);这样做会更好:
import urllib2
file("my_file.txt", "w").write(urllib2.urlopen("http://www.doctorisin.net/").read())
Firefox浏览器默认不仅会保存HTML,还会保存显示网页所需的其他文件(包括样式表和脚本)。