Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/56: Рейтинг темы: голосов - 56, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38

Выгрузить табличные данные со страницы html

03.01.2020, 13:48. Показов 11887. Ответов 35

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Очень надо получить данные со страницы, так как разработчик не будет скорее всего дорабатывать выгрузку в Excel, а сама выгрузка не включает некоторых (как-будто пустых) данных, а они нужны.

Я думала, что смогу выгрузить данные напрямую в Excel или Power Bi, но это не получилось. Это моя тема в другом разделе: Выгрузка страницы в виде таблицы в Excel или Power BI.

Затем друг посоветовал применить Python и parsing. Начала погружаться глубже, установила BeautifulSoup, но как я вижу по тексту, получаемому из requests.get (url, auth = (user, pass), я опять не получаю весь код страницы (поэтому и не сработали советы, которые я находила для Power Bi, а именно доныривания до нужного <div) и я не могу пока получить данные с помощью кода:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
def get_html(url, user, pass_):
    res = requests.get(url, auth=(user,pass_))
    return res.text
 
def get_data(html):
    soup = beautifulsoup(html,'lxml')
    h1 = soup.find('div',id='tw-col-1 hor-flex-child').find('title')
 
def main():
    url = 'https://address/'
    user = user_name
    pass_ = password
    print(get_data(get_html(url, user, pass_)))
На картинке я выделила то, что пытаюсь выцепить из страницы (на странице несколько названий tw-col-1 hor-flex-child и в каждом из них несколько tw-col-2 hor-flex-child) То есть в итоге получается, что это табличные данные, которые записаны каждой отдельной строкой. Заголовки этой таблицы хранятся в tw-col-2 hor-flex-child, они выделены на другой картинке.

Смогу ли я с помощью python выгрузить данные или надо искать другие решения?
Могут ли данные быть скрыты?
На форуме видела ответы про CSS Selectorы - могут ли они помочь?
Миниатюры
Выгрузить табличные данные со страницы html   Выгрузить табличные данные со страницы html  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2020, 13:48
Ответы с готовыми решениями:

Как вытащить табличные данные из HTML страницы?
Вообщем такая проблема: надо с одного сайта скачать данные, которые там находятся в табличном виде.. это таблица участников соревнований со...

Как проще всего выгрузить таблицу с HTML страницы в DataGridView
Появилась задача выгрузить таблицу с этого сайта http://www.forexpros.ru/commodities/gold-historical-data в DataGridView под WinForms. Я в...

Выгрузить данные из html таблицы в в Excel
Здравствуйте. Есть файл в нем данные находятся в таблице &lt;table&gt; данные ,как мне из выгрузить в экзель подскажите пож-та ...

35
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
03.01.2020, 15:35
попробуйте такой вариант, будут ли в нем ваши данные
Python
1
2
3
4
5
6
from lxml import html
def get_data(data):
    tree = html.fromstring(data)
    root = tree.getiterator()
    for elem in root:
        print(elem.tag,elem.attrib,elem.text)
Добавлено через 25 минут
я супом не пользуюсь, но КМК у вас в тексте нет аттрибута 'id', есть 'class'
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
03.01.2020, 19:04  [ТС]
я попробовала, пока опять ничего не произошло.. я же правильно поняла, что data - это уже полученный html текст отсюда?

Code
1
2
3
def get_html(url, user, pass_):
    res = requests.get(url, auth=(user,pass_))
    return res.text
как я понимаю, у меня в том и проблема, что я не могу получить весь текст html, там как будто div вложено в div и так далее..
по элементно я могу нажать inspect и увидеть код, но выгрузить его пока не могу(
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
03.01.2020, 19:21
data здесь res.text, покажите его
возможно страница динамическая и get-запросом сервер не выдает

Добавлено через 11 минут
то что тэги вложены - не то, парсер увидит все тэги
Python
1
2
3
4
5
6
7
8
9
10
>>> from lxml import html
>>> s='''<div id=1><div id=2><div id=3></div></div></div>'''
>>> tree = html.fromstring(s)
>>> root = tree.iter()
>>> for elem in root: print(elem.tag,elem.attrib)
 
div {'id': '1'}
div {'id': '2'}
div {'id': '3'}
>>>
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
03.01.2020, 19:55  [ТС]
Я теперь ещё раз полазила и почти уверена, что код в одном месте написан, то есть посмотрев один элемент,я могу и остальные раскрыть, поэтому надеюсь, что страница не динамическая, но в тексте полная белебирда видна.
может быть проблема в том, что мне надо ещё авторизоваться, поэтому в супе я могла написать user и password, а в lxml я не могу так сделать? По одному и тому же адресу под разными логинами я вижу разную информацию!...

Code
1
''\n<!DOCTYPE html>\n<html lang="en">\n<!-- begin::Head -->\n<head>\n\t<meta charset="utf-8"/>\n\t<title>\n\t\tПортал внешнего персонала\n\t\n\t</title>\n\t<meta name="description" content="">\n\t<meta http-equiv="X-UA-Compatible" content="IE=edge">\n\t<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">\n\t<!--begin::Web font -->\n    <script type="text/javascript" src="/static/CACHE/js/d8e181db3def.js"></script>\n\t<script>\n\t\tWebFont.load({\n\t\t\tgoogle: {"families":["Roboto:300,400,500,600,700"]},\n\t\t\tactive: function () {\n\t\t\t\tsessionStorage.fonts = true;\n\t\t\t}\n\t\t});\n\t</script>\n\t<!--end::Web font -->\n\t<!--begin::Base Styles -->\n\t\n\t\t<link rel="stylesheet" href="/static/CACHE/css/c5aa9b1a408e.css" type="text/css" />\n\t\n\t<!--end::Base Styles -->\n\t<link rel="shortcut icon" href="/static/img/favicon.png" />\n\t\n\t\n\t\n\t\n\n\n\n<script type="text/javascript" src="/static/CACHE/js/4babc01763aa.js"></script>\n</head>\n<!-- end::Head -->\n<!-- end::Body -->\n\n<body class="m-brand--minimize m-aside-left--minimize m--skin- m-header--fixed m-header--fixed-mobile m-aside-left--enabled m-aside-left--skin-dark m-aside-left--fixed m-aside-left--offcanvas m-footer--push m-aside--offcanvas-default">\n<!-- begin:: Page -->\n\n\n\n\t\t<!-- begin:: Page -->\n<div class="m-grid m-grid--hor m-grid--root m-page">\n\t<div class="m-grid__item m-grid__item--fluid m-grid m-grid--desktop m-grid--ver-desktop m-grid--hor-tablet-and-mobile m-login m-login--6" id="m_login">\n\t\t<div class="m-grid__item m-grid__item--order-tablet-and-mobile-2  m-grid m-grid--hor m-login__aside " style="background-image: url(/static/assets/app/media/img/bg/bg-4.jpg">\n\t\t\t<div class="m-grid__item">\n\t\t\t\t<div class="m-login__logo">\n\t\t\t\t\t<a href="#">\n\t\t\t\t\t\t<img src="/static/img/logo_big.png" style="max-height: 60px;">\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="m-grid__item m-grid__item--fluid m-grid m-grid--ver">\n\t\t\t\t<div class="m-grid__item m-grid__item--middle">\n\t\t\t\t\t<span class="m-login__title">Портал внешнего персонала</span>\n\t\t\t\t\t<span class="m-login__subtitle">Планирование и предоставление услуг для бизнеса</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="m-grid__item">\n\t\t\t\t<div class="m-login__info">\n\t\t\t\t\t<div class="m-login__section">\n\t\t\t\t\t\t<a href="https://verme.ru/" class="m-link" target="_blank">© 2019 Верме</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="m-login__section">\n\t\t\t\t\t\t<a href="https://verme.ru/" class="m-link" target="_blank">Контакты</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class="m-grid__item m-grid__item--fluid  m-grid__item--order-tablet-and-mobile-1  m-login__wrapper">\n\t\t\t<!--begin::Body-->\n\t\t\t<div class="m-login__body">\n\t\t\t\t<!--begin::Signin-->\n\t\t\t\t<div class="m-login__signin">\n\t\t\t\t\t<div class="m-login__title">\n\t\t\t\t\t\t<h3>Авторизация</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!--begin::Form-->\n\t\t\t\t\t<form class="m-login__form m-form" action="">\n\t\t\t\t\t\t<div class="form-group m-form__group">\n\t\t\t\t\t\t\t<input class="form-control m-input" type="text" placeholder="Пользователь" name="login" autocomplete="off">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group m-form__group">\n\t\t\t\t\t\t\t<input class="form-control m-input m-login__form-input--last" type="password" placeholder="Пароль" name="password">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t\t<!--end::Form-->\n\t\t\t\t\t<!--begin::Action-->\n\t\t\t\t\t<div class="m-login__action">\n\t\t\t\t\t\t<a href="#">\n\t\t\t\t\t\t\t<button id="m_login_signin_submit" class="btn btn-primary m-btn m-btn--**** m-btn--custom m-btn--air m-login__btn m-login__btn--primary">Войти</button>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!--end::Action-->\n\t\t\t\t\t\n\t\t\t\t\t<!--begin::Divider-->\n\t\t\t\t\t<div class="m-login__form-divider">\n\t\t\t\t\t\t<div class="m-divider">\n\t\t\t\t\t\t\t<span></span>\n\t\t\t\t\t\t\t<spsrc="data:image/png;base64,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" style="max-height: 20px !important;"></img>\n\t\t\t\t\t\t\t\t\t<span>Verme Login</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<!--end::Options-->\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<!--end::Signin-->\n\t\t\t</div>\n\t\t\t<!--end::Body-->\n\t\t</div>\n\t</div>\n</div>\n\n\n<!-- end:: Page -->\n<!--begin::Base Scripts -->\n\n\t<script type="text/javascript" src="/static/CACHE/js/a975f93eccfd.js"></script>\n\n\n<!--end::Base Scripts -->\n<!--begin::Page Content Scripts -->\n\n\n<!--end::Page Content Scripts -->\n<!--begin::Page Snippets -->\n\n\t<script type="text/javascript" src="/static/CACHE/js/b5cc7ee8ac33.js"></script>\n\t<link rel="stylesheet" href="/static/CACHE/css/7a3b91da8af2.css" type="text/css" />\n\n<!--end::Page Snippets -->\n\n</body>\n<!-- end::Body -->\n</html>\n'
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
03.01.2020, 20:02
авторизация идет через requests, суп и lxml - парсинг полученного текста
https://python-scripts.com/requests
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
04.01.2020, 11:03  [ТС]
Теперь я думаю, что может всё-таки динамически, раз я не могу получить данные. В sources в одном месте написано
Code
1
2
3
4
5
6
7
8
9
10
                <div class="m-stack__item m-stack__item--fluid m-header-head" id="m_header_nav">
                    <div id="m_header_menu" class="m-header-menu m-aside-header-menu-mobile
                        m-aside-header-menu-mobile--offcanvas  m-header-menu--skin-light
                        m-header-menu--submenu-skin-light m-aside-header-menu-mobile--skin-dark
                        m-aside-header-menu-mobile--submenu-skin-dark ">
                        <ul class="m-menu__nav m-menu__nav--submenu-arrow ">
                            <!-- Формируется динамически - см. блок инициализации данных-->
                            <script>
                                var request_page_party = 'promo'
                            </script>
а дальше там как раз кусок, который везде повторяется, который мне нужен
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<div class="tw-body ver-flex-child-long" 
                ref="table_body" @scroll="onScroll" 
                :class="{'selecting-via-mouse': isSelectingViaMouse}"
                :style="{height: bodyHeightCss, maxHeight: bodyHeightCss, 'overflow-y': overflowY, 'padding-right': paddingRight}"
            >
            <div :style="{height: bodyPaddingTopCSS}"></div>
            <div v-if="!blocks.length && !isLoading || (blocks.length && !blocks[0].rows.length)" class="empty-table-placeholder" v-text="emptyTablePlaceholderErrored || settings.emptyTablePlaceholder"></div>
            <div v-if="!blocks.length && isLoading" class="empty-table-placeholder">
                <i class="fas fa-spinner fa-spin m--font-success" style="font-size: 24px"></i>
            </div>
            <div v-for="block in blocks" :key="block.id" v-if="!block.isHiddenByScrolling"><!--для блока-->
                <div class="tw-row hor-flex-parent row-separator" v-if="blocks.length > 1"> <!--заголовок блока-->
                    <div class="tw-col-1 hor-flex-child"></div>
                    <div class="tw-col-2 hor-flex-child-long" v-text="block.name"></div>
                </div>
                <div class="tw-row hor-flex-parent" 
                    v-for="row in block.rows" 
                    :key="row.code"
                    v-if="!row.isHiddenByScrolling"
                    > <!--для строки внутри блока-->
                    <div class="tw-col-1 hor-flex-child">
                        <div class="empl-block hor-flex-parent" @click="onEmplRowClick(row)" :class="{'selected': ~selectedURowCodes.indexOf(row.urows[0].code)}">
                            <div class="icon hor-flex-child">
                                <i class="fa" :class="row.area.icon ? ('fa-'+ row.area.icon) : 'fa-store'" :style="{color: row.area.color || 'black'}"></i>
                            </div>
                            <div class="name hor-flex-child-long">
                                <span class="name-head" v-text="row.organization.name" :title="row.organization.name" :style="{cursor:'pointer'}"></span>
                                <br>
                                <span class="name-captions">
                                    <!-- <span class="name-caption" v-for="c in row.captions" v-text="c.label" :style="{color: c.color}"></span> -->
                                    <span class="name-caption" v-text="row.area.name" :style="{color: row.area.color || 'black'}"></span>
                                </span>
                            </div>
                            <div class="summ hor-flex-child">
                                <div class="top-summ" :text-content.prop="row.shiftsDurationSumm | timeDeltaHM"></div>
                            </div>
                        </div>
                        <!-- пустые блоки для подсветки во время выделения -->
                        <div class="empl-block hor-flex-parent" 
                            v-for="(urow, urow_index) in row.urows" 
                            v-if="urow_index > 0"
                            :class="{'selected': ~selectedURowCodes.indexOf(urow.code)}">
                            <div class="icon hor-flex-child">
                            </div>
                            <div class="name hor-flex-child-long">
                                <span class="name-head"></span>
                                <br>
                                <span class="name-captions">
                                    <span class="name-caption"></span>
                                </span>
                            </div>
где я могу поискать про выгрузку данных с динамической страницы?

*белиберда (выше в сообщении, а то исправить его уже не могу)

Добавлено через 40 минут
мне видимо надо selenium разбирать...
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
04.01.2020, 13:19
на javascript форуме, но точно сказать трудно, надо копать

Добавлено через 8 минут
если вы в браузере ланные ваши видите, можно сохранить в файл потом распарсить.
а автоматом - нада в инспекторе network смотреть какой запрос идет на получение данных
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
04.01.2020, 22:52  [ТС]
да, я как раз смотрела тут Парсер таблицы
нашла network, но всё боялась нажать ctrl +R.. вроде что-то выгрузилось, но всё таки пока ещё не то, что надо..
Code
1
2
3
4
"content": {
            "size": 12629,
            "mimeType": "application/x-javascript",
            "text": ";(function(){function aa(a,b,c){return a.call.apply(a.bind,arguments)}function ba(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}function n(a,b,c){n=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf(\"native code\")?aa:ba;return n.apply(null,arguments)}var p=Date.now||function(){return+new Date};function r(a,b){this.F=a;this.k=b||a;this.H=this.k.document}var ca=!!window.FontFace;r.prototype.createElement=function(a,b,c){a=this.H.createElement(a);if(b)for(var d in b)b.hasOwnProperty(d)&&(\"style\"==d?a.style.cssText=b[d]:a.setAttribute(d,b[d]));c&&a.appendChild(this.H.createTextNode(c));return a};function s(a,b,c){a=a.H.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(c,a.lastChild)}\nfunction t(a,b,c){b=b||[];c=c||[];for(var d=a.className.split(/\\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<d.length;g+=1)if(b[e]===d[g]){f=!0;break}f||d.push(b[e])}b=[];for(e=0;e<d.length;e+=1){f=!1;for(g=0;g<c.length;g+=1)if(d[e]===c[g]){f=!0;break}f||b.push(d[e])}a.className=b.join(\" \").replace(/\\s+/g,\" \").replace(/^\\s+|\\s+$/,\"\")}function u(a,b){for(var c=a.className.split(/\\s+/),d=0,e=c.length;d<e;d++)if(c[d]==b)return!0;return!1}\nfunction v(a){if(\"string\"===typeof a.fa)return a.fa;var b=a.k.location.protocol;\"about:\"==b&&(b=a.F.location.protocol);return\"https:\"==b?\"https:\":\"http:\"}function x(a,b,c){function d(){l&&e&&f&&(l(g),l=null)}b=a.createElement(\"link\",{rel:\"stylesheet\",href:b,media:\"all\"});var e=!1,f=!0,g=null,l=c||null;ca?(b.onload=function(){e=!0;d()},b.onerror=function(){e=!0;g=Error(\"Stylesheet failed to load\");d()}):setTimeout(function(){e=!0;d()},0);s(a,\"head\",b)}\nfunction y(a,b,c,d){var e=a.H.getElementsByTagName(\"head\")[0];if(e){var f=a.createElement(\"script\",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&\"loaded\"!=this.readyState&&\"complete\"!=this.readyState||(g=!0,c&&c(null),f.onload=f.onreadystatechange=null,\"HEAD\"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,c&&c(Error(\"Script load timeout\")))},d||5E3);return f}return null};function z(){this.S=0;this.K=null}function A(a){a.S++;return function(){a.S--;B(a)}}function C(a,b){a.K=b;B(a)}function B(a){0==a.S&&a.K&&(a.K(),a.K=null)};function D(a){this.ea=a||\"-\"}D.prototype.d=function(a){for(var b=[],c=0;c<arguments.length;c++)b.push(arguments[c].replace(/[\\W_]+/g,\"\").toLowerCase());return b.join(this.ea)};function E(a,b){this.Q=a;this.M=4;this.L=\"n\";var c=(b||\"n4\").match(/^([nio])([1-9])$/i);c&&(this.L=c[1],this.M=parseInt(c[2],10))}E.prototype.getName=function(){return this.Q};function da(a){return F(a)+\" \"+(a.M+\"00\")+\" 300px \"+G(a.Q)}function G(a){var b=[];a=a.split(/,\\s*/);for(var c=0;c<a.length;c++){var d=a[c].replace(/['\"]/g,\"\");-1!=d.indexOf(\" \")||/^\\d/.test(d)?b.push(\"'\"+d+\"'\"):b.push(d)}return b.join(\",\")}function I(a){return a.L+a.M}\nfunction F(a){var b=\"normal\";\"o\"===a.L?b=\"oblique\":\"i\"===a.L&&(b=\"italic\");return b}function ea(a){var b=4,c=\"n\",d=null;a&&((d=a.match(/(normal|oblique|italic)/i))&&d[1]&&(c=d[1].substr(0,1).toLowerCase()),(d=a.match(/([1-9]00|normal|bold)/i))&&d[1]&&(/bold/i.test(d[1])?b=7:/[1-9]00/.test(d[1])&&(b=parseInt(d[1].substr(0,1),10))));return c+b};function fa(a,b){this.a=a;this.j=a.k.document.documentElement;this.O=b;this.f=\"wf\";this.e=new D(\"-\");this.da=!1!==b.events;this.u=!1!==b.classes}function ga(a){a.u&&t(a.j,[a.e.d(a.f,\"loading\")]);J(a,\"loading\")}function K(a){if(a.u){var b=u(a.j,a.e.d(a.f,\"active\"))
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
04.01.2020, 23:11
когда-то пользовался
Selenium IDE

Selenium IDE – плагин к браузеру Firefox, который может записывать действия пользователя, воспроизводить их, а также генерировать код для WebDriver или Selenium RC, в котором выполняются те же самые действия. В общем, это «Selenium-рекордер».
Добавлено через 2 минуты
https://habr.com/ru/company/uniweb/blog/117648/
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
08.01.2020, 18:23  [ТС]
sess = requests.Session()
data = {"login":"name", "password":"secret"}
url = "address"
res = sess.post(url, data=data)

print(res.content)

выходит вот что - ничего похожего на то, что я вижу в html
и написано там forbidden,
может ли быть так, что доступ нельзя просто так получить к коду?

Code
1
b'\n<!DOCTYPE html>\n<html lang="en">\n<head>\n  <meta http-equiv="content-type" content="text/html; charset=utf-8">\n  <meta name="robots" content="NONE,NOARCHIVE">\n  <title>403 Forbidden</title>\n  <style type="text/css">\n    html * { padding:0; margin:0; }\n    body * { padding:10px 20px; }\n    body * * { padding:0; }\n    body { font:small sans-serif; background:#eee; color:#000; }\n    body>div { border-bottom:1px solid #ddd; }\n    h1 { font-weight:normal; margin-bottom:.4em; }\n    h1 span { font-size:60%; color:#666
вопрос, если мне нужно зайти на сайт, но вход осуществляется с другой страницы, нужно ли мне указывать адрес страницы с формой для ввода логина и пароля, а потом перенаправиться на другую страницу на этом сайте?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
08.01.2020, 20:06
ставьте тэг HTML в коде
сервер вам говорит - вход запрещен
вот вам пример с selenium
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from selenium import webdriver
 
mail = 'mymail'
pas = 'mypassword'
 
def init_driver():
    driver = webdriver.Firefox()
    driver.set_window_size(800,600)
    driver.set_window_position(0, 0)
    driver.implicitly_wait(5) # seconds
    return driver
 
def dropbox_auth(driver,mail,pas):
    try:
        driver.get('https://www.dropbox.com/login')
        driver.find_element_by_name('login_email').send_keys(mail)
        driver.find_element_by_name('login_password').send_keys(pas)
        driver.find_element_by_xpath( '//button[@class="login-button signin-button button-primary"][@type="submit"]').click()
    except Exception as e:
        print(repr(e))
            
if __name__ == "__main__":
    driver = init_driver()
    dropbox_auth(driver,mail,pas)
    input('?')
    driver.quit()
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
08.01.2020, 20:20  [ТС]
Спасибо! Я сейчас попробую к себе приспособить, ещё вот что нашла, думала использую
https://stackoverflow.com/ques... er-postman
Код из ответа:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 import requests
url = "http://test:180/test.aspx"
session = requests.Session()
session.trust_env = False #disable OS proxy
headers = {
    'authorization': "Basic d3NndWVzdDpzbWMxxjMhQA==",
    'cache-control': "no-cache",
    'postman-token': "157e52fa-95f5-5287-9ee0-xxxxxxxx"
}
 
response = session.get(url, headers=headers)
print(response.text)
 
#use empty proxy instead
proxies = {
  "http": None,
  "https": None,
}
response = requests.get(url, auth=HTTPBasicAuth('test', 'test'), proxies=proxies)
print (response)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
08.01.2020, 20:27
Лучший ответ Сообщение было отмечено Eliy как решение

Решение

КМК вам с selenium проще будет, можно в браузере видеть результат

Добавлено через 2 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
 
def init_driver():
    driver = webdriver.Firefox()
    driver.set_window_size(800,600)
    driver.set_window_position(0, 0)
    driver.implicitly_wait(5) # seconds
    return driver
 
def query(driver,q_str):
    try:
        driver.get('http://ya.ru')
        text = driver.find_element_by_id('text')
        text.send_keys(q_str)
        text.send_keys(Keys.RETURN)
    except Exception as e:
            print(repr(e))
            
if __name__ == "__main__":
    driver = init_driver()
    query(driver,'selenium python 3 парсинг динамических страниц')
    input('?')
    driver.quit()
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
08.01.2020, 21:45  [ТС]
честно говоря, я пока застряла, так как у меня хром, я написала ему Chrome(), он наругался, что ChromeDrivera у него нет...

WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chr... river/home

я пошла по ссылке, он открыл cmd и написал:

Starting ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f14 3-refs/branch-heads/3945@{#614}) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

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

и я наконец достала данные таблицы, нажав Copy outerHTML table-widget ver-flex-parent shift-assign-table
то есть мне надо внутри неё пробежаться как-то...

Code
1
2
3
4
5
6
7
8
9
10
def get_data(html):
    soup = BeautifulSoup(html)
    data=[]
    table = soup.find("table-widget ver-flex-parent shift-assign-table")
    for tw-row in table.find_all("tw-row hor-flex-child"):
        data.append([tw-row.get_text() for tw-col1 in span.find_all("title")])...
дальше надо дописать
        
    data = pd.DataFrame(data[1:], columns=["shop","schedule"])
    print (data)
Миниатюры
Выгрузить табличные данные со страницы html  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
08.01.2020, 22:09
Лучший ответ Сообщение было отмечено Eliy как решение

Решение

Цитата Сообщение от Eliy Посмотреть сообщение
он наругался, что ChromeDrivera у него нет...
https://selenium-python.com/in... ver-chrome
на скрине я не вижу никаких данных, одни заголовки
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
08.01.2020, 22:18  [ТС]
да, сорри, данные не могу показать, я и так много выкладываю, но данные примерные можно увидеть на принтскринах выше, где я замазывала конкретные места, то есть в целом это то, что мне надо обработать/получить и до текущего момента я даже не могла это получить в текстовом виде, а теперь оно у меня полностью есть без необходимости нажимать на треугольнички и раскрывать, и я рада, хотя там и пока много ещё лишних div, span
Миниатюры
Выгрузить табличные данные со страницы html  
0
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
08.01.2020, 22:37  [ТС]
и Xpath теперь нашла к таблице!
/html/body/div[1]/div/div[2]/div/div/div[2]/div[2]/div
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
08.01.2020, 22:52
можно проще
//span[@class="time-start"]
//span[@class="time-end"]
1
0 / 0 / 0
Регистрация: 08.06.2015
Сообщений: 38
09.01.2020, 12:28  [ТС]
почти, но пока нет результата итогого(((
он опять ругается..


Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
payload = {"login":"name", "password":"secret"}
url = "https://address/page/"
data=[]
response = requests.get(url, params=payload)
tree = html.fromstring(response.text)
----> суп пока убрала, на него тоже ругался  soup = BeautifulSoup(response.content, 'lxml')
table = tree.find('.//div[@class="table-widget ver-flex-parent shift-assign-table"]')
for shop in table.find_all('.//div[@class=tw-row-hor-flex-parent"]'):
    data.append(shop.find('.//span[@class="name-head"]').get_text)
    for day in shop.find('.//div[@class="day ver-flex-parent"]'):
        if day.find('.//div[@class="time"]') is None:
            data.append("0,0,0")
        else:
            data.append(day.find('.//span[@class="time-start"]').get_text)
            data.append(day.find('.//span[@class="time-end"]').get_text)
            data.append(day.find('.//span[@class="owner-name"]').get_text)
print (table.text)
вот, что пишет
AttributeError Traceback (most recent call last)
<ipython-input-118-800a9e83b99f> in <module>()
16 soup = BeautifulSoup(response.content, 'lxml')
17 table = tree.find('.//div[@class="table-widget ver-flex-parent shift-assign-table"]')
---> 18 for shop in table.find_all('.//div[@class=tw-row-hor-flex-parent"]'):
19 data.append(shop.find('.//span[@class="name-head"]').get_text)
20 for day in shop.find('.//div[@class="day ver-flex-parent"]'):

AttributeError: 'NoneType' object has no attribute 'find_all'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2020, 12:28
Помогаю со студенческими работами здесь

Нужно макросом выгрузить данные из страницы интернета
&quot;https://fgis.gost.ru/fundmetrology/registry/4/items/1390777&quot; Помогите выгрузить данные из этой страницы. p, Добавлено через 5 часов...

Как выгрузить данные из мемо поля базы Access в Html с сохранением переноса строки ?
Как выгрузить данные из мемо поля базы Access в Html с сохранением переноса строки ?

Не работают табличные тэги html в PHP
Нужно вывести данные из БД в виде таблицы, но тэги tr и td не работают - данные выводятся сплошным текстом. function...

Табличные данные
Здравствуйте, подскажите; имеется таблица с числами в виде нескольких столбцов, по ним делает расчёт. Проблема в том что прописал все...

Получить данные со страницы HTML
Открыл такую тему в ветке по Делфям, но потом понял, что наверное, не совсем там спросил. Продублирую здесь - возможно, кто-то поможет,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru