我想使用Python中的MechanicalSoup软件包在此ONS webpage上下载Excel文件。我已经阅读了MechanicalSoup documentation。我在StackOverflow和其他地方进行了广泛的搜索,以寻找一个可以效仿的例子。
我的尝试是:
# Install dependencies
# pip install requests
# pip install BeautifulSoup4
# pip install MechanicalSoup
# Import libraries
import mechanicalsoup
import urllib.request
import requests
from bs4 import BeautifulSoup
# Create a browser object that can collect cookies
browser = mechanicalsoup.StatefulBrowser()
browser.open("https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/l2kq/qna")
browser.download_link("https://www.ons.gov.uk/generator?format=xls&uri=/economy/grossdomesticproductgdp/timeseries/l2kq/qna")
在最后一行中,我也尝试过:
browser.download_link(link="https://www.ons.gov.uk/generator?format=xls&uri=/economy/grossdomesticproductgdp/timeseries/l2kq/qna",file="c:/test/filename.xls")
2019年1月25日更新: 并感谢AKX在下面的评论,我已经尝试了
browser.download_link(re.escape("https://www.ons.gov.uk/generator?format=xls&uri=/economy/grossdomesticproductgdp/timeseries/l2kq/qna"))
在每种情况下,我都会收到错误:
mechanicalsoup.utils.LinkNotFoundError
但是该链接确实存在。尝试将其粘贴到您的地址栏中以确认:
https://www.ons.gov.uk/generator?format=xls&uri=/economy/grossdomesticproductgdp/timeseries/l2kq/qna
我在做什么错了?
2019年1月25日更新 :感谢AKX在下面的回答,这是完整的MWE,可以回答我的问题(发给以后遇到相同困难的任何人) :
# Install dependencies
# pip install requests
# pip install BeautifulSoup4
# pip install MechanicalSoup
# Import libraries
import mechanicalsoup
import urllib.request
import requests
from bs4 import BeautifulSoup
import re
# Create a browser object that can collect cookies
browser = mechanicalsoup.StatefulBrowser()
browser.open("https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/l2kq/qna")
browser.download_link(link_text=".xls",file="c:/py/ONS_Data.xls" )
答案 0 :(得分:0)
我还没有用过机械汤,而是看文档
此函数的行为类似于follow_link()
和follow_link
说(强调我的意思)
- 如果链接是bs4.element.Tag(即来自先前对links()或find_link()的调用),则请遵循该链接。
- 如果链接没有href属性或为无,则将链接视为 url_regex ,然后使用find_link()查找它。指定的所有其他参数都将转发到此函数。
问号(除其他事项外)是正则表达式(regex)元字符,因此,如果要将它们用于follow_link
/ download_link
,则需要转义它们:
import re
# ...
browser.download_link(re.escape("https://www.ons.gov.uk/generator?format=xls&uri=/economy/grossdomesticproductgdp/timeseries/l2kq/qna"))
但是,如果您访问的第一页不包含该直接链接,那么我不确定它是否会有所帮助。 (不过请先尝试。)
您也许可以使用浏览器的基础requests
会话(该会话可能托管cookie罐)(假设下载需要一些cookie)来直接下载文件:
resp = browser.session.get("https://www.ons.gov.uk/generator?format=xls&uri=/economy/grossdomesticproductgdp/timeseries/l2kq/qna")
resp.raise_for_status() # raise an exception for 404, etc.
with open('filename.xls', 'wb') as outf:
outf.write(resp.content)
答案 1 :(得分:0)
您正在使链接(如<a href=... >
之类的网页中的元素)和URL(格式为http://example.com
的字符串)之间混乱。 MechanicalSoup的follow_link
在页面中查找链接并进行跟踪,就像您在浏览器中单击它一样。