我正在尝试使用mechanize在网站上解析并提交表单,但似乎内置表单解析器无法检测表单及其元素。我怀疑它在形成不良的HTML上很窒息,我想尝试使用一个解析器进行预解析,该解析器更好地设计用于处理错误的HTML(例如lxml或BeautifulSoup),然后将经过修饰的清理输出提供给表单解析器。我需要机械化不仅用于提交表单而且用于维护会话(我在登录会话中使用此表单。)
我不确定如何做到这一点,如果确实有可能..我不熟悉HTTP协议的各种细节,如何让各个部分一起工作等等。任何指针?
答案 0 :(得分:10)
我有一个问题,表单字段中缺少表单字段,我找不到任何格式错误的HTML,但我认为这是原因所以我使用BeautifulSoup的美化功能来解析它并且它有效。
resp = br.open(url)
soup = BeautifulSoup(resp.get_data())
resp.set_data(soup.prettify())
br.set_response(resp)
我很想知道如何自动解决这个问题。
编辑:了解如何自动执行此操作
class PrettifyHandler(mechanize.BaseHandler):
def http_response(self, request, response):
if not hasattr(response, "seek"):
response = mechanize.response_seek_wrapper(response)
# only use BeautifulSoup if response is html
if response.info().dict.has_key('content-type') and ('html' in response.info().dict['content-type']):
soup = BeautifulSoup(response.get_data())
response.set_data(soup.prettify())
return response
# also parse https in the same way
https_response = http_response
br = mechanize.Browser()
br.add_handler(PrettifyHandler())
br
现在将使用BeautifulSoup
来解析内容类型中包含html的所有响应(mime类型),例如text/html
答案 1 :(得分:3)
阅读mechanize website第一页上的大例子:
# Sometimes it's useful to process bad headers or bad HTML:
response = br.response() # this is a copy of response
headers = response.info() # currently, this is a mimetools.Message
headers["Content-type"] = "text/html; charset=utf-8"
response.set_data(response.get_data().replace("<!---", "<!--"))
br.set_response(response)
因此,似乎很有可能使用另一个解析器预处理响应,该解析器将重新生成格式良好的HTML,然后将其反馈给机械化以进行进一步处理。
答案 2 :(得分:1)
您正在寻找的内容可以使用lxml.etree
xml.etree.ElementTree
提供的lxml
模拟器(和替换版)来完成:
首先,我们采取错误的格式错误的HTML:
% cat bad.html
<html>
<HEAD>
<TITLE>this HTML is awful</title>
</head>
<body>
<h1>THIS IS H1</H1>
<A HREF=MYLINK.HTML>This is a link and it is awful</a>
<img src=yay.gif>
</body>
</html>
(观察打开和关闭标签之间的混合情况,缺少引号)。
然后解析它:
>>> from lxml import etree
>>> bad = file('bad.html').read()
>>> html = etree.HTML(bad)
>>> print etree.tostring(html)
<html><head><title>this HTML is awful</title></head><body>
<h1>THIS IS H1</h1>
<a href="MYLINK.HTML">This is a link and it is awful</a>
<img src="yay.gif"/></body></html>
观察我们已经更正了标记和引用。
如果您之前在解析HTML时遇到问题,这可能就是您正在寻找的答案。至于HTTP的细节,这完全是另一回事。