Как считывать данные из URL-адреса Odata в AWS glue и записывать в корзину S3 в AWS

#python #amazon-web-services #odata #aws-glue

#python #amazon-веб-сервисы #odata #aws-glue

Вопрос:

Я пытаюсь написать код на python для чтения данных с URL-адреса OData, созданного в S4 Hana / Gateway, и записать его в корзину AWS S3. Я пишу код в AWS Glue.

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

S4 Hana находится в облаке. Статус ответа равен 200, что означает, что я могу перейти по URL-адресу.

Не могли бы вы, ребята, помочь мне решить эту проблему, а также предоставить следующие шаги по дальнейшему написанию кода для чтения данных с этого URL-адреса Odata и записи их в корзину S3?

Код, написанный до сих пор —

 import json
import requests
from pyspark.sql.types import *
import xml.etree.ElementTree as ET



S4User = <my S4 user name>
S4PWD = <my S4 password>
print(" i am before the odata url is hit ")
srcMetaBaseURL = 'http://IP:PORT/sap/opu/odata/sap/ZV_ACDOCA_CDS/?sap-ds-debug=trueamp;sap-client=999'
print(" i am after the odata url is hit ")
response = requests.get(srcMetaBaseURL, auth=(S4User, S4PWD))
print("hello from glue")
xml_root = ET.fromstring(response.content)
  

Ошибка —

 i am before the odata url is hit i am after the odata url is hit
hello from glue
Traceback (most recent call last): File "/tmp/TestJobS4S3", line 17, in <module> xml_root = ET.fromstring(response.content) File "/usr/lib64/python3.7/xml/etree/ElementTree.py", line 1315, in XML parser.feed(text) File "<string>", line None xml.etree.ElementTree.ParseError: mismatched tag: line 102, column 2
  

Значение response.content —

 b'<!DOCTYPE html>n<html lang="en">n<head>n<meta charset="utf-8">n<meta name="viewport" content="width=device-width, initial-scale=1.0">n<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">n<title>nZV_ACDOCA_CDS | /n</title>n<style type="text/css">nhtml{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}nbody{margin:0;padding-top:51px;font-family:Verdana,Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}na{color:#0076cb;text-decoration:none;}na:focus{outline:thin dotted #0076cb;outline-offset:-1px;}na:hover,a:active{outline:0;}na:hover{color:#004a7e;text-decoration:underline;}nh1,h2,h3,h4,h5,h6{margin:9px 0;font-family:inherit;font-weight:bold;line-height:1;color:#f0ab00;text-rendering:optimizelegibility;}nh1{font-size:36px;line-height:40px;}nh2{font-size:30px;line-height:40px;}nh3{font-size:24px;line-height:40px;}nh4{font-size:18px;line-height:20px;}nh5{font-size:14px;line-height:20px;}nh6{font-size:12px;line-height:20px;}nul{padding:0;margin:0 0 9px 25px;}nul ul{margin-bottom:0;}nli{line-height:18px;}nhr{margin:18px 0;border:0;border-top:1px solid #cccccc;border-bottom:1px solid #ffffff;}nstrong{font-weight:bold;}nem{font-style:italic;}npre{margin:10px 0px;}npre.error{margin:-8px 0px;color:#9d261d;background-color:#f9f9f9;}n.article{margin:0 18px;}ntable{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}n.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}n.table th{font-weight:bold;}n.table thead th{vertical-align:bottom;}n.table thead th.name{width:180px;min-width:180px;}n.table thead th.value{width:100%;}n.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}n.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5 .nav{position:relative;width:auto;min-height:38px;padding-left:0;padding-right:0;border:1px solid #d4d4d4;border-width:0 0 1px;n -webkit-box-shadow:0 1px 10px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 10px rr .nav ul>li>a:focus,.header .nav ul>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;}n.header .nav ul>li.active>a,.header .nav ul>li.active>a:hover,.header .nav ul>li.active>a:focus{color:#ffffff;text-shadow:0 1px 0 #999999;background-color:#f9c544;n background-image:-webkit-linear-gradient(top, #ffd671, #f0ab00);background-image:-moz-linear-gradient(top, #ffd671, #f0ab00);n background-image:-o-linear-gradient(top, #ffd671, #f0ab00);background-image:linear-gradient(to bottom, #ffd671, #f0ab00);n background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffd671', endColorstr='#fff0ab00', GradientType=0);text-decoration:none;}n.header .nav ul>li>a:focus,.header .nav ul>li.active>a:focus{outline:thin dotted #0076cb;outline-offset:-1px;}n.header .nav ul>li.disabled>a{color:#999999;}n.header .nav ul>li.disabled>a:hover{textdecoration:none;background-color:transparent;cursor:defau<}n</style>n<base href="http://20.185.218.171:8000/sap/opu/odata/sap/ZV_ACDOCA_CDS/">n</head>n<body>n<div class="header">n <div class="nav">n <ul>n <li><a tabindex="1" href="#sec1">Body</a></li>n <li><a tabindex="2" href="#sec2">Request</a></li>n <li><a tabindex="3" href="#sec3">Response</a></li>n <li><a tabindex="4" href="#sec4">Server</a></li>n <li class="disabled"><a ==g.selectoramp;amp;(!n||n.test(g.namespace))amp;amp;!m.elem.disabled)Function(i)amp;amp;a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h " was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===bamp;amp;(a.cache=!1),a.crossDomainamp;amp;(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharsetamp;amp;(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,eamp;amp;d.parentNodeamp;amp;e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){damp;amp;d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocalamp;amp;ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!aamp;amp;"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajaxamp;amp;f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeTypeamp;amp;h.overrideMimeTypeamp;amp;h.overrideMimeType(c.mimeType),!c.crossDomainamp;amp;!e["X-Requested-With"]amp;amp;(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContentamp;amp;c.data||null),d=function(a,e){var j,k,l,m,n;try{if(damp;amp;(e||h.readyState===4)){d=b,iamp;amp;(h.onreadystatechange=f.noop,cbamp;amp;delete cd[i]);if(e)h.readyState!==4amp;amp;h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,namp;amp;n.documentElementamp;amp;(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!jamp;amp;c.isLocalamp;amp;!c.crossDomain?j=m.text?200:404:j===1223amp;amp;(j=204)}}}catch(p){e||g(-1,p)}mamp;amp;g(j,k,m,l)},!c.async||h.readyState===4?d():(i=  cc,cbamp;amp;(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){damp;amp;d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([ \-]=)?([\d .\-] )([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g  )d=this[g],d.styleamp;amp;(e=d.style.display,!f._data(d,"olddisplay")amp;amp;e==="none"amp;amp;(e=d.style.display=""),e===""amp;amp;f.css(d,"display")==="none"amp;amp;f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g  ){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d  )if(this[d].style){var g=f.css(this[d],"display");g!=="none"amp;amp;!f._data(this[d],"olddisplay")amp;amp;f._data(this[d],"olddisplay",g)}for(d=0;d<e;d  )this[d].styleamp;amp;(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)amp;amp;f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1amp;amp;f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=camp;amp;f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==gamp;amp;(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasingamp;amp;b.specialEasing[g]||b.easing||"swing";if(h==="hide"amp;amp;d||h==="show"amp;amp;!d)return b.complete.call(this);camp;amp;(g==="height"||g==="width")amp;amp;(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"amp;amp;f.css(this,"float")==="none"amp;amp;(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=nullamp;amp;(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"amp;amp;(f.style(this,i,(n||1) o),m=(n||1)/k.cur()*m,f.style(this,i,m o)),l[1]amp;amp;(n=(l[1]==="-="?-1:1)*n m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){aamp;amp;this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===thisamp;amp;(bamp;amp;a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=aamp;amp;typeof a=="object"?f.extend({},a):{complete:c||!camp;amp;b||f.isFunction(a)amp;amp;a,duration:a,easing:camp;amp;b||bamp;amp;!f.isFunction(b)amp;amp;b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)amp;amp;d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1amp;amp;f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2 .5)*d c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.stepamp;amp;this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=nullamp;amp;(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()amp;amp;f.timers.push(h)amp;amp;!clamp;amp;(co?(cl=!0,g=function(){clamp;amp;(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0amp;amp;(c=!1);if(c){e.overflow!=nullamp;amp;!f.support.shrinkWrapBlocksamp;amp;f.each(["","X","Y"],function(a,b){d.style["overflow" b]=e.overflow[a]}),e.hideamp;amp;f(d).hide();if(e.hide||e.show)f'   html   '</ul><span class="obj">}</span>' : '<span class="obj">{}</span>';n }n }n /* convert xml to html */n function formatXML(document) {n return formatElement(document.documentElement);n function form{n switchTab(window.location.hash);n }).trigger('hashchange');n } else {n $(window).data('~hash~', window.location.hash);n window.setInterval(function() {n if ($(window).data('~hash~') != window.location.hash) {n $(window).data('~hash~', window.location.hash);n $active.nextAll(':not(.disabled):first').children('a').attr('href');n break;n }n if (hash amp;amp; $(hash).length) {n window.location.hash = hash;n }n }n });n});n</script>n</body>n</html>'
  

Комментарии:

1. Ошибка, которой вы делитесь, — это ошибка синтаксического анализа xml. Вы знаете, почему? Какова ценность response.content ?

2. добавление значения сообщения для response.context .. Это огромный файл. Это содержит ответ от URL-адреса odata, который он вызывает

3. Дело в том, что это недопустимый xml … и вы пытаетесь его проанализировать. Кстати, какова ценность response.status_code

4. Это URL-адрес odata, который возвращает xml. Есть ли способ проанализировать URL-адрес odata в python? Значение для response.status_code равно 200

5. попробуйте распечатать ответ с помощью инструкции print, а затем поработайте над его анализом