извлечь курс валюты с сайта, используя wget и awk - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу вычесть текущий показатель из какого-либо источника:

<span id="aq_usdpln#1_c5">3.81990</span>

результат должен быть USD: 3.81

, также получить этот код, но он не работает:

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0"|awk -F"[ >]" '/<span id="aq_usdpln#1_c5">/ {printf "%s"}'

Может ли кто-нибудь помочь и вставить правильный код?Спасибо

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Сложность, с которой я столкнулся при использовании html (и javascript и т. Д.), Возвращаемых wget, состоит в том, что он имеет длину 148506 символов и состоит из полей 5007 при использовании -F'[><]' в качестве разделителя файлов.

Одно из решений состоит в том, чтобы перебрать каждое из полей и найти текст "span id=aq_usdpln_c5", а затем принять следующее поле в качестве значения с плавающей запятой, например,

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | 
awk -F'[><]' '{
    for (i = 1; i <= NF; i++)
        if ($i == "span id=aq_usdpln_c5")
            printf "USD: %.2f\n", $(i+1)
}'

Пример использования/ Вывод

Вы можете просто вставить вышеперечисленное в терминал, например,

$ wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" |
> awk -F'[><]' '{
>     for (i = 1; i <= NF; i++)
>         if ($i == "span id=aq_usdpln_c5")
>             printf "USD: %.2f\n", $(i+1)
> }'
USD: 3.82

Посмотрите вещи и дайте мне знать, если у вас есть вопросы.

0 голосов
/ 20 февраля 2019

Не могли бы вы попробовать следующее.

yor_command | awk -F"[><]" '{printf("USD: %.02f\n",$3)}'
0 голосов
/ 20 февраля 2019

Сайт постоянно меняется, и он будет предоставлять разный источник для разных мест и разных UA.
Когда я тестирую его, возвращаемый исходный код не содержит идентификатор "aq_usdpln#1_c5", но вместо этого aq_usdpln_c5,и у него нет кавычек вокруг идентификатора.

Я думаю, что лучше сначала использовать GNU grep, изменить regex немного более обобщенно, затем подать на awk:

$ wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | grep -oP "span id=.?aq_usdpln(#1)?_c5.?>\K.*?(?=<)"|awk -F. '{printf "USD: %s.%s\n",$1,substr($2,1,2)}'
USD: 3.81

Регулярное выражение span id=.?aq_usdpln(#1)?_c5.?>\K.*?(?=<) для grep:
.? для открытой кавычки, она может существовать или нет.
(#1)? аналогична, чтобы быть совместимой, если существует #1.
\K означает, что регулярное выражение будет соответствовать вещамдо него, но только возвращать вещи после него.
.*? означает совпадать с более длинными вещами, но не с greddy.
(?=<) означает, что совпадение должно заканчиваться до <, но не содержать < сама.

Также я предлагаю вам добавить UA в вашу команду wget.

Удалите \n в части "USD: %s.%s\n", если вы не хотите использовать новую строку после результата.

И если вам нужно round вместо усечь , затем awk '{printf "USD: %.2f",$0}' для awk детали.
- Из вашего примера я вижу, что вы хотите усечь , поскольку 3.81990 округляется до 3.82, ноВам может понадобиться эта опция тоже.

Если вам не нужна часть grep, это тоже работает (нужен GNU awk):

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F'[.>]' '/^span id=.?aq_usdpln(#1)?_c5/{printf "USD: %s.%s\n",$2,substr($3,1,2)}' RS='<'

Или этот, который не требует GNU awk:

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F. 'sub(/^span id=.?aq_usdpln(#1)?_c5\"?>/,""){printf "USD: %s.%s\n",$1,substr($2,1,2)}' RS='<'
0 голосов
/ 20 февраля 2019

Вы почти у цели, вам не хватало вызова функции sed .Sed поможет вам разобрать и преобразовать текст в оболочке.

Попробуйте:

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F ">" '{ print $2 }' | sed 's/<\/span\>//' | awk '{ print substr($0,0,4) }'
3.81
  1. awk -F ">" '{ print $2 }' разбивает текст на разделитель > и печатает вторую часть
  2. sed 's/<\/span\>//', заменяеттекст /span> с пометкой
  3. awk '{ print substr($0,0,4) }' substr (s, i [, n]) Возвращает не более n-символьной подстроки s, начиная с i.Если n опущено, используйте остальную часть s.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...