1 回答
TA贡献1850条经验 获得超11个赞
请求-wsgi 适配器提供了一个适配器,用于在 URL 上挂载可调用的 WSGI。您可以使用会话.mount()
来挂载适配器,因此对于请求-html,您将改用并挂载到该适配器。HTMLSession
$ pip install flask requests-wsgi-adapter requests-html
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "<p>Hello, World!</p>"
from requests_html import HTMLSession
from wsgiadapter import WSGIAdapter
s = HTMLSession()
s.mount("http://test", WSGIAdapter(app))
r = s.get("http://test/")
assert r.html.find("p")[0].text == "Hello, World!"
使用请求的缺点是,您必须在要向其发出请求的每个URL之前添加。Flask 测试客户端不需要这样做。"http://test/"
除了使用请求和请求-html 之外,您还可以告诉 Flask 测试客户端返回一个响应,该响应将为您执行美丽苏美解析。在快速浏览了请求-html之后,我仍然更喜欢直接的烧瓶测试客户端和美丽汤API。
$ pip install flask beautifulsoup4 lxml
from flask.wrappers import Response
from werkzeug.utils import cached_property
class HTMLResponse(Response):
@cached_property
def html(self):
return BeautifulSoup(self.get_data(), "lxml")
app.response_class = HTMLResponse
c = app.test_client()
r = c.get("/")
assert r.html.p.text == "Hello, World!"
您还应该考虑使用 HTTPX 而不是请求。它是一个现代的,维护良好的HTTP客户端库,与请求共享许多API相似之处。它还具有出色的功能,例如异步,HTTP / 2以及直接调用WSGI应用程序的内置功能。
$ pip install flask httpx
c = httpx.Client(app=app, base_url="http://test")
with c:
r = c.get("/")
html = BeautifulSoup(r.text)
assert html.p.text == "Hello, World!"
添加回答
举报