【问题标题】:python - Save HTML from browserpython - 从浏览器中保存 HTML
【发布时间】:2018-03-15 02:37:33
【问题描述】:
我在浏览器中打开了自己的本地 HTML 文件。当我单击某个按钮时,该按钮的类更改为“已选择”。我想要做的是让 Python 在浏览器中获取文件的当前更新的 HTML,并将其覆盖为原始 HTML 文件。这里的目标是将浏览器更新的更改保存为新的 HTML 文件,这样下次我打开此文件时,无需再次进行更改。
通常我会:
- 向 url 发送 HTTP 请求
- 将响应转换为 BeautifulSoup 对象
-
然后将其保存为myfile.html的字符串
url = 'http://google.com'
r = requests.get(url)
soup = str(BeautifulSoup(r.content,'lxml'))
file.write(soup)
但我无法发送 HTTP 请求,因为它是当前在我的浏览器中打开的文件,而不是服务器上要请求的网页。所以我不确定如何将结构化的 HTML 接收到 Python 中以进行进一步处理。
【问题讨论】:
-
听起来像XY Problem。如果您在手动单击浏览器中的按钮来更新 HTML 时遇到麻烦,为什么不在文本编辑器中手动更新 HTML?
标签:
python
html
file-io
beautifulsoup
python-requests
【解决方案1】:
您可以尝试使用selenium 包。您需要在您运行它的同一文件夹中拥有您选择的浏览器的 webdriver.exe(下面的代码使用 Chrome Web 驱动程序)。为简洁起见,此示例要求您从控制台将其作为实时脚本运行。
from selenium import webdriver
browser = webdriver.Chrome()
这将启动网络驱动程序。它看起来就像一个普通的浏览器。
browser.get('YOUR URL HERE')
对网站进行一些更改,完成后:
html = browser.page_source
这会将修改后的 html 作为字符串返回到 html,您可以使用它来覆盖原始 html 文件。
【解决方案2】:
您可以使用内置库http.server 来提供页面。
在一个控制台中,切换到您的工作目录:
J:\>echo hello > hello.html
J:\>python -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
在另一个方面:
>>> import requests
>>> resp = requests.get("http://127.0.0.1:8000/hello.html")
>>> resp.text
'hello \r\n'
>>> resp.status_code
200
您会在服务器窗口中看到日志条目,例如
127.0.0.1 - - [15/Mar/2018 13:45:40] "GET /hello.html HTTP/1.1" 200 -