• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Парсер курса доллара на Python

значит пруфов не будет? короче очередной лолик, не осиливший регулярки. чтд.
ждём истории из серии bs4 работает быстрее, чем машинный код.
Я тебе сказал - скачай исходники bs4 разберись подробнее в вопросе, пойми разницу между твоей наспех составленной кривой регуляркой и работой нормальной библиотеки. Так что следи за языком. Я лично такому как ты доказывать уже ничего не хочу. Учиться не хочешь, только спорить на форумах...
 
Я тебе сказал - скачай исходники bs4 разберись подробнее в вопросе, пойми разницу между твоей наспех составленной кривой регуляркой и работой нормальной библиотеки.
сохранил это в закладки. лол. спс за беседу.
 
Ну наконец ты понял хоть что то, мелкое ничтожество:)
ты всё-таки сказочный долбаёб. бс4 сам юзает регулярки. да и про скорость вообще не было ни слова, ибо на такой задаче на неё вообще похуй, если ты, конечно, не собираешься парсить курс валют миллион раз в минуту. жду от тебя бенч с пруфом - как бс4, который юзает re, парсит быстрее чем сам re.

Не нужно оскарблений взаимных, особенно wumpus. Пока предупреждаю устно, дальше будут балы. Давайте общаться как нормальные ребята, спасибо.
 
тащемта суп юзает три разных парсера, и два (html5lib, htmlparser) из них юзают регулярки. Третий (lxml) компилится, и его сорцы я не смотрел, но и там есть применение вышеназванных библиотек.
немного пруфов (делайте поиск по tag_regexp и re.)
https://github.com/html5lib/html5li...ebb80e6feaff666/html5lib/treewalkers/etree.py
https://github.com/python/cpython/blob/3.8/Lib/html/parser.py

И насколько я понял, wumpus изначально имел ввиду, что тащить к этому маленькому скрипту две либы смысла вообще небыло.
Несомненно, если бы мы парсили дикое количество инфы, то на больших страницах регекспы проиграют, т.к. ведут поиск по не размеченным данным (и чем больше в теле страницы сорцев, тем медленнее)
 
тащемта суп юзает три разных парсера, и два (html5lib, htmlparser) из них юзают регулярки. Третий (lxml) компилится, и его сорцы я не смотрел, но и там есть применение вышеназванных библиотек.
немного пруфов (делайте поиск по tag_regexp и re.)
https://github.com/html5lib/html5li...ebb80e6feaff666/html5lib/treewalkers/etree.py
https://github.com/python/cpython/blob/3.8/Lib/html/parser.py

И насколько я понял, wumpus изначально имел ввиду, что тащить к этому маленькому скрипту две либы смысла вообще небыло.
Несомненно, если бы мы парсили дикое количество инфы, то на больших страницах регекспы проиграют, т.к. ведут поиск по не размеченным данным (и чем больше в теле страницы сорцев, тем медленнее)
Да по телу dom, но не по всей же странице. Я ничего объяснять лично вумпусу не буду, потому что у него как бы сказать все очень плохо с социальным взаимодействием... ему аргументы не нужны, только подтверждения его правоты.
 
тащемта суп юзает три разных парсера, и два (html5lib, htmlparser) из них юзают регулярки. Третий (lxml) компилится, и его сорцы я не смотрел, но и там есть применение вышеназванных библиотек.
немного пруфов (делайте поиск по tag_regexp и re.)
https://github.com/html5lib/html5li...ebb80e6feaff666/html5lib/treewalkers/etree.py
https://github.com/python/cpython/blob/3.8/Lib/html/parser.py

И насколько я понял, wumpus изначально имел ввиду, что тащить к этому маленькому скрипту две либы смысла вообще небыло.
Несомненно, если бы мы парсили дикое количество инфы, то на больших страницах регекспы проиграют, т.к. ведут поиск по не размеченным данным (и чем больше в теле страницы сорцев, тем медленнее)
ну про lxml речи не было. он кстати лидирует в q/a вида "how to improve performance" по тегу bs4. у супа одно из узких мест - построение деревьев, которое в нашем случае вообще не нужно, если рассматриваем конкретный таск - дёрнуть страницу и вытащить из неё одно единственное значение, которое размещено статично в теге вида <div ... id="last_last" ...></div>. парсить это как html вообще не имеет смысла. на такой задаче бенчи bs4 + lxml против re будут в пользу последнего.
 
конкретный таск - дёрнуть страницу и вытащить из неё одно единственное значение, которое размещено статично в теге вида <div ... id="last_last" ...></div>.
Если прям уж статично все, кроме цены, не проще ли из HTTP респонса вытянуть ответ по определённому смещению?
 
Последнее редактирование:
Если прям уж статично все, не проще ли из HTTP респонса вытянуть ответ по определённому смещению?
_https://ru.investing.com/currencies/usd-rub
там не на столько статично :) например для вхождения last_last два респонса дают разное смещение 105511 и 105561. + много других факторов.

*span
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Парсер - это программа которая собирает данные с интернета, анализирует их и выдает в нужном формате.
В этом уроке мы напишем парсер, который будет отслеживать курс доллара. Использовать будем python (один из лучших языков программирования для работы с информацией).

Для начала нужно скачать библиотеки (введите код ниже в коммандной строке)

Код:
pip install requests
pip install bs4


requests - библиотека для получения кода веб сайта (информация о курсе есть в коде веб страницы)
bs4 - библиотека для работы с HTML, CSS кодом (с помощью него мы будем искать в коде нужную нам информацию)


Создаём файл dollar.py (можете назвать его по-другому) и имртируем все нужные библиотеки:
Python:
import requests
from bs4 import BeautifulSoup


Парсить будем с сайта investing.com, поэтому нужно сохранить URL страницы с курсом доллара (https://ru.investing.com/currencies/usd-rub) в виде переменной
Python:
# import ...

URL = 'https://ru.investing.com/currencies/rub-usd'


Также сначала нужно узнать свой User Agent. Просто введите в google "my user agent" и скопируйте строку в переменную:
Python:
# import ...
# URL ...

HEADERS = {'user-agent' : '*ваш user agent*'}


Теперь нам нужно получить код страницы:
Python:
# ...

page = requests.get (URL, headers = HEADERS)


Переходим на сайт и нажимаем Ctrl+Shift+I. Теперь мы видим код страницы прямо в браузере. Нажимаем на кнопку слева сверху (для выбора элемента на странице) и выбираем текст с курсом доллара (если мы будем знать, где в коде находится текст с курсом доллара, мы можем каждый раз обращаться к этой части кода и выводить этот текст). Узнаём, что курс храниться в теге с id равным "late-late". Теперь создадим переменную soup, чтобы найти тег с нужным нам id:
Код:
# ...

# page.content - код страницы

soup = BeautifulSoup (page.content, 'html.parser')

currency = soup.find (id = 'late-late') # находим тег с id 'late-late' (в этом теге хранится курс доллара)

print (currency.text) # выводим текст, хранящийся в этом теге


Вот весь код парсера:
Python:
import requests
from bs4 import BeautifulSoup

URL = 'https://ru.investing.com/currencies/usd-rub'
HEADERS = {'user-agent' : '*ваш user agent*'}

page = requests.get (URL, headers = HEADERS)
soup = BeautifulSoup (page.content, 'html.parser')

currency = soup.find (id = 'late-late').text

print (currency)
Статья очень зачётная. Много нового узнал. Много по времени заняло?
 
Да по телу dom, но не по всей же странице.
Извини, но ты, видимо, не до конца понимаешь что такое DOM (либо я не понял, зачем ты это написал). DOM как раз таки и строится благодаря этому "парсингу регулярками", чтобы потом ты уже мог применять селекторы и различные методы для управления содержимым. До парсинга, страница это просто набор текста с разметкой (не всегда валидной).
 
Благодаря этой статье, спустя годы безуспешных попыток, я наконец то разобрался, как спарсить число с веб страницы. Спасибо тебе, автор :)
Но стоит заметить, что место такой статье больше на хабре или подобных бордах. А то не хорошо, чтоб такой важный материалл был доступен только избранным, собравшимся здесь.

Тут лучше постить статьи по типу таких вот:
:)
 
Perl:
perl -MLWP::Simple -MJSON -e '$ref = decode_json(get("https://www.cbr-xml-daily.ru/daily_json.js")); print $ref->{"Valute"}->{"USD"}->{"Value"}."\n"'
добавь декодинг JSON однострочником (вместо либы) и голосую за тебя
 
добавь декодинг JSON однострочником (вместо либы) и голосую за тебя

Perl:
curl https://www.cbr-xml-daily.ru/daily_jsonp.js --silent | perl -ne 'print($_ =~ m/USD.*?Value":(\d+\.\d+)/m);print("\n")'

(Я аж опешил) Полностью независимое решение. Вместо курлыка можно использовать вгет или что еще.
 
Я ващет думол что ты реализуешь парсинг JSON в общем виде, то бишь перепишешь либу в однострочник.

Но все равно ты молодец, вместо поправок буду голосовать за тебя.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх