2014-12-10 1 views
1

XML이있는 페이지가있는 간단한 웹 서버가있는 장치가 있습니다. 나는 파이썬 3.4로 그 결과를 포착하고 싶다. 이 사이트는 페이지의 소스 코드에서 가져온 것과 똑같습니다. 나는 '내가 응답을 Wiresharked 파이썬 3.4와이 간단한 XML 사이트를 읽는 것은 무엇입니까?

http.client.BadStatusLine: <?xml version="1.0" encoding="utf-8"?> 

(:

import urllib.request 
url_str = 'http://192.168.1.2/state.xml' 
f = urllib.request.urlopen(url_str).read() 
print (f) 

나는 다음과 같다 예외가 : 다음과 같이

<?xml version="1.0" encoding="utf-8"?> 
<datavalues> 
<units>F</units> 
<sensor1temp>67.5</sensor1temp> 
<sensor2temp>57.9</sensor2temp> 
<sensor3temp>54.6</sensor3temp> 
<sensor4temp>x.x</sensor4temp> 
<relay1state>0</relay1state> 
<relay2state>0</relay2state> 
</datavalues> 

내가 사용하는 코드는 매우 간단하다 Wireshark와 프로가 아니므로 나와 함께 맨발로). 데이터는 Frame11/Ethernet II/인터넷 프로토콜 버전 4/TCP의 네 블록으로 나옵니다. xml의 ​​데이터는 프레임 11 부분에 포함되었습니다. 그게 무슨 뜻인지는 확실하지 않습니다.

저는 직장에서 자이 썬 2.5를 사용합니다. 위의 기술은 잘 작동합니다. Python 3.4 솔루션을 사용할 수 있습니까? 귀하의 도움을 많이 주시면 감사하겠습니다. 감사.

+2

오 마이. 해당 서버는 HTTP/0.9로 회신 중입니다. – icktoofay

답변

3

HTTP/0.9처럼 상태 코드를 제공하지 않고 서버가 직접 데이터로 회신하는 것처럼 보입니다. 분명히 urllib.request은 지원하지 않습니다. 다행스럽게도 HTTP/0.9는 간단한 프로토콜이므로 평범한 소켓을 사용하면 충분히 쉽습니다.

import socket 
from io import BytesIO 

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
conn.connect(('192.168.1.2', 80)) 
conn.send(b'GET /state.xml\r\n') 
buffer = BytesIO() 
while True: 
    chunk = conn.recv(4096) 
    if chunk: 
     buffer.write(chunk) 
    else: 
     break 
data = buffer.getvalue() 
관련 문제