curl
для получения, lynx
для разбора и awk
для извлеченияПожалуйста, не разбирайте XML/HTML с помощью sed
, grep
и т.д. HTML является контекстно-свободным, а sed
и друзья - только регулярными. 1
url='https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017'
user_agent= 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'
curl -sA "${user_agent}" "${url}" \
| lynx -stdin -dump \
| awk '/1 EUR/{ print $4 }'
Для надежного извлечения содержимого нужен какой-то парсер HTML. Здесь я использую lynx
(текстовый веб-браузер), но существуют и более легкие альтернативы.
Здесь curl
извлекает страницу, затем lynx
разбирает ее и выводит текстовое представление. /1 EUR/
заставляет awk
искать строку 1 EUR
, находя только строку:
1 EUR = 1.079992 USD
Затем { print $4 }
заставляет его вывести четвертый столбец, 1.079992
.
curl
Поскольку мой парсер HTML - lynx
, curl
не нужен:
url='https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017'
user_agent= 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'
lynx -useragent="${user_agent}" -dump "${url}" \
| awk '/1 EUR/{ print $4 }'
1 А pcre
(grep -P
в некоторых реализациях) может описать некоторые контекстно-свободные или даже контекстно-зависимые наборы строк, но не все.
Отредактировано 2017-12-23 для добавления строки user-agent (притворяется Firefox), поскольку сайт в настоящее время блокирует curl
и lynx
.
Другое решение: html2text
curl -s 'https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=2/12/2017' \
| html2text \
| grep '1 Euro' \
| awk '{ print $4 }'
Предложение: используйте инструменты, поддерживающие xml / html:
curl "$url" | xmllint -html -xpath '//span/strong[2]/text()' -
curl "$url" | xidel -s -e "//span/strong[2]" -
или даже
xidel -e "/span/strong[2]" $url
Направьте вывод curl
на следующую команду grep
:
grep --color -Po '(?<=<strong>1 EUR = )\d+\.\d+(?= USD</strong>)'