2011-05-07 4 views
0

urllib2.request를 사용하여 XML을 수신하는 웹 서비스를 쿼리하고 있습니다. 웹 서비스의 속도 제한 (1 call/second)을 위반하면 속도 제한을 위반했다는 HTML 백 워드를받습니다.xml.dom.minidom.parse()가 XML 속성에 유니 코드가 포함되어 있으면 실패 함

각 호출 후에 2-3 초 동안 time.sleep()을 수행 할 수 있지만 어떤 이유로 든 속도 제한을 위반합니다.

내 응답은 XML 또는 HTML 중 하나입니다, 내가

try: 
    dom = xml.dom.minidom.parseString(response_text) 
    except xml.parsers.expat.ExpatError: 
    return False 

    if len(dom.getElementsByTagName('html')) == 0: 
    return True 
    else: 
    return False 

이 작업을 수행하지만 취득하는 HTML 요소의 존재를 테스트 후 xml.dom.minidom()를 사용하고있어 테스트하려면 XML 속성 중 하나에 XML이 포함 된 경우를 실행합니다. 이 경우, parseString을() 명령이 경우

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/python/default-2.6/lib/python2.6/xml/dom/minidom.py", line 1918, in  parse 
    return expatbuilder.parse(file) 
    File "/opt/python/default-2.6/lib/python2.6/xml/dom/expatbuilder.py", line 924, in parse 
    result = builder.parseFile(fp) 
    File "/opt/python/default-2.6/lib/python2.6/xml/dom/expatbuilder.py", line 207, in parseFile 
    parser.Parse(buffer, 0) 
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 3125 

실패, 열 3125는 (유래 내 유니 코드를 숨기고) 앰퍼샌드 파운드-X-9가 들어 일부 속성 값 텍스트의 일부입니다.

xml.dom.minidom이이를 처리 할 수 ​​있습니까? 이 외에도 구문 분석을 실패하게 만드는 XML 외에도 다른 문제가있을 수 있습니까?

또한 커뮤니티에 이러한 유형의 상황이있을 경우 다른 방법으로 처리 할 수 ​​있습니다.

가 여기에 있습니다 내가 그들의 속도 제한을 위반 한 웹 서비스 반환 것입니다 경우

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="eng"> 
    <head> 
     <title>Service Temporarily Unavailable - Rate Limited</title> 
    </head> 
    <body style="text-align:center;background-color:white;"> 
     <h1>Service Temporarily Unavailable</h1> 
     <hr /> 
     <div> 
      You have used this service too often in a short time. Please wait before using this service again. 
      <br/><br/> 
      Please visit the <a href="http://wiki.xxxx.com/index.php?title=API_Usage">wiki</a> for more details. 
     </div> 
    </body> 
</html> 

답변

0

내가 &#x9이 탭라고 생각합니다. 특별한 html 엔티티를 원래대로 되돌리려면 http://docs.python.org/library/htmllib.html#module-htmlentitydefs을 시도해야합니다. (&lt; 등의 문제가있을 수 있습니다.) 또는 &#x9을 공백으로 대체하는 문자열 대체를 수행 할 수 있습니다.

물건을 파싱하고 파서가 문제를 일으킬 때 (예 : 패턴에 맞지 않음) 작업을 중지하는 대신 파서가 계속 실행되도록해야하지만 경고를 내 보내야합니다 . 이렇게하면 문제가 무엇인지 알 수 있고 잠재적으로 문제를 수정하거나 문제가 있음을 알 수 있습니다.

속도 제한 문제에 대해서도 로컬에서 처리를 수행 할 수 있도록 요청 된 HTML을 한 번 캐시하면 어떨까요?

+0

감사합니다. 문제는 타사 웹 서비스의 API 속도 제한이 깨졌습니다. 그들은 내가 살 수있는 1 초당 통화 건수를 기록하지만, 3 초 이상 잠자더라도 가끔 속도 제한 오류가 발생합니다. –

0

또한 결과를 분석하기 전에 HTML의 캐릭터를 테스트 할 수 있습니다 :

if response_text.lstrip().startswith('<!DOCTYPE html'): 
    # we received an html response, sleep again 
... 

또한 탭 개체를 포함하는 속성에 날려 minidom을 가져올 수 없습니다. 아마도 그것은 끝 부분의 세미콜론이없는 &#9과 같이 부적절하게 종료 된 엔티티 시퀀스일까요? Minidom은 적절하게 이스케이프 처리 된 엔티티를 가지고 있습니다.

text = '<root><a href="&#9;foo&lt;">link</a></root>' 
tree = minidom.parseString(text) 
print tree.toxml() 

u'<?xml version="1.0" ?>\n<root><a href="\tfoo&lt;">link</a></root>' 
관련 문제