将html保存为文本

4 投票
2 回答
8957 浏览
提问于 2025-04-17 10:06

我有一段JavaScript代码,它可以显示一个网页的源代码。

javascript:h=document.getElementsByTagName('html')[0].innerHTML;function%20disp(h){h=h.replace(/</g,%20'\n&lt;');h=h.replace(/>/g,'&gt;');document.getElementsByTagName('body')[0].innerHTML='<pre>&lt;html&gt;'+h.replace(/(\n|\r)+/g,'\n')+'&lt;/html&gt;</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 个回答

1

你看到的其实是静态网页和动态网页之间的区别。

静态网页和动态网页不一样,动态网页在加载的时候可以修改底层的html。JavaScript可以获取加载页面的完整html,因为它可以访问浏览器创建的修改过的DOM。

相反,如果同样的网页是从服务器下载下来的,然后直接给BeautifulSoup处理,它只能把它当作静态html来解析。要获取完整的动态内容,这个页面需要先通过浏览器(或者类似的工具)处理。

4

如果你想保存网页服务器给你的完整HTML代码,不要使用BeautifulSoup(这是一个用来解析HTML的工具,它在处理代码时可能会修改原来的格式);这样做会更好:

import urllib2
file("my_file.txt", "w").write(urllib2.urlopen("http://www.doctorisin.net/").read())

Firefox浏览器默认不仅会保存HTML,还会保存显示网页所需的其他文件(包括样式表和脚本)。

撰写回答