我正在尝试使用python请求模块获取远程页面,重建DOM树,进行一些处理并将结果保存到文件中。当我获取一个页面,然后将其写入文件时,一切正常(我可以稍后在浏览器中打开一个html文件,并正确呈现它)。

但是,如果我创建pyquery对象并进行一些处理,然后通过使用str转换将其保存,则它将失败。具体来说,特殊字符(如&&等)会在已保存源的脚本标签中进行修改(由pyquery的应用程序引起),这会阻止页面正确呈现。

这是我的代码:

import requests
from lxml import etree
from pyquery import PyQuery as pq

user_agent = {'User-agent': 'Mozilla/5.0'}
r = requests.get('http://www.google.com',headers=user_agent, timeout=4)

DOM = pq(r.text)
#some optional processing
fTest = open("fTest.html","wb")
fTest.write(str(DOM))
fTest.close()


因此,问题是:如何确保在应用pyquery后不会转义特殊字符?我想它可能与lxml(用于pyquery的父库)有关,但是在经过繁琐的在线搜索以及使用不同对象序列化方式进行的实验之后,我仍然没有实现。也许这也与unicode处理有关?

提前谢谢了!

最佳答案

我已经找到了解决该问题的精巧解决方案,以及该代码以前无法正常工作的原因。

首先,您可以使用http://lxml.de/lxmlhtml.html仔细阅读页面。
它有一个“使用电子工厂创建HTML”部分。在本节之后,他们指出了etree.tostring() method仅适用于XML的事实。但是对于具有脚本或样式标签的HTML的其他可能性,它将使事情变得混乱。所以..
其次,解决方案是使用重载方法html.tostring()

最终的工作代码是:

# for networking
import requests
# for parsing and serialization
from lxml import etree
from lxml.html import tostring as html2str # IMPORTANT!!!
from pyquery import PyQuery as pq

user_agent = {'User-agent': 'Mozilla/5.0'}
r = requests.get('http://www.google.com',headers=user_agent, timeout=4)

# construct DOM object
DOM = pq(r.text)
# do stuff with DOM
#
# save result to file
fTest = open("fTest.html","wb")
fTest.write(html2str(DOM.root)) # IMPORTANT!!!
fTest.close()


希望以后能节省一些时间!玩得开心! ;)

关于python - pyquery对象转换为字符串时如何转义特殊字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13437476/

10-13 06:29