Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2017, 12:22   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию получить курс Евро с сайта ЦБ РФ

Здравствуйте!
Фиг знает куда это написать, т.к. относится ко многим языкам, поэтому написал в раздел, в котором нашлась последняя активность по теме регулярных выражений.
Как написать регулярное выражение, чтобы в результат вернулось значение, состоящее из нескольких строк?
Пытаюсь получить курс Евро с сайта ЦБ РФ. Там он заключён вот в такую структуру:
Код:
<tr>
                <td class="title">
                      Евро <ins>€</ins>
                </td>
                <td class="weak">
                  <ins class="rubl">руб.</ins>&nbsp;63,2661</td>
                <td>
                  <div class="w_data_wrap">
                    <ins class="rubl">руб.</ins>&nbsp;<i class="down" title="- 0,5214">↓</i>62,7447</div>
                </td>
              </tr>
Искать только по цифрам - не надёжно: мало ли какие новые цифры появятся на странице. Как сначала выбрать весь блок <tr>...</tr>, внутри которого есть "Евро"? С регулярными выражениями только начал разбираться; все найденные примеры возвращают совпадения, встречающиеся только внутри строки.
Ship_1 вне форума Ответить с цитированием
Старый 15.03.2017, 12:29   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Для HTML лучше использовать парсер HTML.

А курсы валют обычно предоставляются через API и/или в более удобных для обработки форматах (XML, JSON, ...)

http://www.cbr.ru/scripts/Root.asp?PrtId=SXML
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.03.2017, 12:53   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Забыл уточнить: я программку в Python'е делаю. А точнее, в QPython3 на Андроиде.
Как парсить в HTML мне найти не удалось. В подавляющем большинстве примеров парсят на lxml, но его в QPython3 нет, а как его туда добавить (и можно ли вообще что-то в него добавить) мне найти не удалось.
Ещё встречал вариант, что парсить можно на BeautifulSoup - с ним ситуация аналогичная lxml.
И нашёл парсинг через регулярные выражения модулем re.
HTMLParser тоже в QPython3 отсутствует...

API не хотелось бы использоваться, т.к. далеко не везде оно есть, поэтому хочется разобраться с парсингом. В частности, в программке я получаю информацию о курсе ещё и с banki.ru
Ship_1 вне форума Ответить с цитированием
Старый 15.03.2017, 13:31   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Парсинг обычной страницы сайта никак не застрахован от "мало ли какие новые ..... появятся на странице".
Цитата:
Сообщение от Ship_1 Посмотреть сообщение
все найденные примеры возвращают совпадения, встречающиеся только внутри строки.
А какая разница? Надо только режим MULTILINE указать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.03.2017, 14:02   #5
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну да, но тут всё-таки появляется подстраховка в виде дополнительных слов.
Спасибо, вроде MULTILINE проглотил. Но никак не могу понять как задать условие. Додуматься смог только до
Код:
<tr>.*</tr>
Но, как я вычитал, "." заменяет любой символ кроме "\n", но мне его тоже надо включить. А знак, заменяющий вообще любой символ, найти не смог...

Последний раз редактировалось Ship_1; 15.03.2017 в 14:07.
Ship_1 вне форума Ответить с цитированием
Старый 15.03.2017, 14:05   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так в MULTILINE он вроде обычно и \n.

Вообще наверно проще сначала просто удалить все \n, \r, \t и т.п. из HTML, заменить &nbsp; на ' '.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.03.2017, 14:10   #7
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну почему-то возвращает пустоту... А если попробовать найти td, а не tr, то возвращает однострочные.
Может, придётся заменять, если не получится всё-таки разобраться с мультилайном.
И ещё не пойму есть ли что-то типа "или". Например, цифры курса с ЦБ РФ можно взять через
Код:
\d{2}?\,\d{4}?
Дату можно взять через
Код:
\d{2}?\.\d{2}?\.\d{4}?
. А как это объединить в одно условие, чтобы возвращались и дата и курс?
Ship_1 вне форума Ответить с цитированием
Старый 15.03.2017, 14:16   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Замена лучше потому что надеяться на форматирование HTML не стоит.

Браузеру все равно
Код:
<div>
    <h2>Hello</h2>
</div>
или
Код:
<div><h2>Hello</h2></div>
На многих сайтах он минимизируется (автоматически в процессе сборки) для уменьшения веса.

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
И ещё не пойму есть ли что-то типа "или"
Цитата:
Сообщение от Ship_1 Посмотреть сообщение
А как это объединить в одно условие, чтобы возвращались и дата и курс?
А "или" причем?
В регекспах можно создавать группы (groups), видимо нужны они.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 15.03.2017 в 14:21.
Alex11223 вне форума Ответить с цитированием
Старый 15.03.2017, 14:26   #9
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А "или" причем?
Начинал с мысли "если в строке есть дата или курс, то добавлять в результат."
Ship_1 вне форума Ответить с цитированием
Старый 15.03.2017, 14:49   #10
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Убрал "\n". Теперь
Код:
<tr>.*</tr>
выводит только одно значение - вообще всю страницу... И
Код:
<tr>.*Евро.*</tr>
выводит всю страницу. А
Код:
^<tr>.*Евро.*</tr>
выводит ничего.
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить данные с сайта lord24 Работа с сетью в Delphi 23 22.10.2015 11:23
Получить данные с сайта Andrey85 Работа с сетью в Delphi 2 10.11.2010 21:37
Получить таблицу с сайта Иллидан Общие вопросы Delphi 9 29.09.2010 21:49
Получить информацию с сайта dimafe6 Работа с сетью в Delphi 4 03.07.2010 14:21
получить курс валют WebMoney DeDoK Работа с сетью в Delphi 4 08.02.2010 12:45