Скачать файл с механическим суппортом - PullRequest
0 голосов
/ 24 января 2019

Я хочу скачать файл Excel на этой веб-странице ONS , используя пакет MechanicalSoup в Python.Я прочитал документацию по MechanicalSoup .Я безуспешно искал пример для подражания в 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")

Обновление 25 января 2019 года: И благодаря комментарию 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

Что я делаю не так?

Обновление 2, 25 января 2019 года: Благодаря ответам 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 голосов
/ 25 января 2019

Вы путаете между ссылкой (элемент на веб-странице, такой как <a href=... >) и URL (строка вида http://example.com). follow_link MechanicalSoup ищет ссылки на странице и следует по ней, как если бы вы щелкнули по ней в браузере.

0 голосов
/ 24 января 2019

Я не использовал Механический суп, но смотрю на документы,

Эта функция работает аналогично follow_link ()

и follow_link говорит (выделено мое)

  • Если ссылка представляет собой тег bs4.element.Tag (т. Е. Из предыдущего вызова links () или find_link ()), перейдите по ссылке.
  • Если ссылка не имеет атрибута href или имеет значение None, обработайте ссылку как url_regex и найдите ее с помощью find_link (). Все дополнительные аргументы передаются этой функции.

Знаки вопроса (помимо прочего) являются метасимволами регулярных выражений (регулярных выражений), поэтому вы захотите избежать их, если хотите использовать их для 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)
...