RoboBrowser 可以打开 html 字符串吗?

Can RoboBrowser open a html string?

我想在包含某些形式的 HTML 字符串上受益于 RoboBrowser 的强大功能。

通常Robobrowser是这样使用的:

url = "whatever.com"
browser = RoboBrowser(history=True)
browser.open(url)
thatForm = browser.get_form("thatForm")
thatForm["thisField"].value = "some value"
browser.submit(thatForm)

我想使用字符串的 html 内容来做同样的事情,我期待像下面这样的东西工作:

content = "<html>...</html>"
browser = RoboBrowser(history=True)
browser.open(content)

但是,这不会,因为 open 方法期望字符串是 url 而不是 html 内容,有没有什么可以做的,有什么解决方法吗我可以在某处传递 html 内容字符串并 RoboBrowser 解析它吗?

好吧,我找到了一个解决方案,虽然不是很优雅,但它确实有效,基本上它都围绕 _update_state 函数展开,该函数实际上在 Robobrowser 打开 URL 时在某个时候在内部调用:

def open(self, url, method='get', **kwargs):
    """Open a URL.

    :param str url: URL to open
    :param str method: Optional method; defaults to `'get'`
    :param kwargs: Keyword arguments to `Session::request`

    """
    response = self.session.request(method, url, **self._build_send_args(**kwargs))
    self._update_state(response)

因此,解决方案是简单地创建一个包含我们要解析的 html 的假响应:

fake_response = requests.Response()
fake_response._content = the_html_we_want_Robobrowser_to_parse
browser = RoboBrowser()
browser._update_state(fake_response)
my_form = browser.get_form("myform")
browser.submit_form(my_form)

瞧瞧:)