下载带有Mechanicalsoup的文件

时间:2019-01-24 17:18:33

标签: python mechanicalsoup

我想使用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" )

2 个答案:

答案 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在页面中查找链接并进行跟踪,就像您在浏览器中单击它一样。