2015-01-07 8 views
1

JS 코드를 Python으로 변환하고 있으며 미니 DOM을 사용하고 있지만 특정 사항이 올바르게 작동하지 않습니다. 그들은 JavaScript로 실행될 때 작동합니다. 일관된 변경/순서 (즉, 클래스 속성이 추가 된 위치)를 원하기 때문에 변환 중이며, Python의 더 쉬운 기능 중 일부를 사용할 수 있습니다. 내가 건너 한Python MiniDom이 요소를 제대로 제거하지 못했습니다.

내 최신 문제는 이것이다 :

fonts = doc.getElementsByTagName('font') 

while(fonts.length > 0): 
    # Create a new span 
    span = doc.createElement("span") 
    # Give it a class name based on the color (colors is a map) 
    span.setAttribute("class", colors[fonts[0].getAttribute("color")]) 

    # Place all the children inside 
    while(fonts[0].firstChild): 
     span.appendChild(fonts[0].firstChild) 
    # end while 

    # Replace the <font> with a the <span> 
    print(fonts[0].parentNode.toxml()) 
    fonts[0].parentNode.replaceChild(span, fonts[0]) 
# end while 

문제는 그것이 있어야처럼 자바 스크립트와는 달리, 요소가 fonts에서 제거되지 않습니다 점이다. 표준 (레벨 3) DOM 규칙을 사용하는 더 나은 라이브러리가 있습니까? 아니면 xPath (다른 모든 DOM 파서가 사용하는 것)를 사용하지 않으려 고하면 해킹해야 할 것입니다.)?

감사합니다.

+0

[문서] (https://docs.python.org/2/library/xml.dom.html)의 맨 아래에서 요소 컬렉션이 실제 DOM처럼 작동하지 않는다고 경고하는 것을 볼 수 있습니다 . 스크립트가있는 웹 페이지의 브라우저에서 스크립팅하지 않기 때문에 일반적으로 문제가되지 않습니다. 당신은 단지 정적 인 파싱 된 HTML을 다루는 것입니다. 이 경우와 다른 많은 경우 코드를 변경하여 원하는 효과를 얻을 수 있어야합니다 (예 : 항상 첫 번째 요소를 보는 대신 '글꼴'을 반복). 이 특정 작업을 수행하는 방법이나 완전히 "실제"DOM 동작을 얻는 방법에 대한 질문입니까? – BrenBarn

+0

@BrenBarn, 둘 다. 나는 진짜 DOM 동작을 좋아하지만, 그렇지 않다면이 문제를 어떻게 해결할 것인가. 그것이 무엇이든 바뀌면 v3.4에서 작업하십시오. – David

답변

1

에서 오는 콜렉션이 "라이브"가 아니라는 의미에서 "실제"DOM처럼 작동하지 않는다는 것을 파이썬 DOM (페이지의 맨 아래)에서 확인할 수 있습니다. 여기서 getElementsByTagName을 사용하면 그 순간에 일치하는 요소의 정적 스냅 샷을 반환합니다. xml.dom을 사용할 때 브라우저 내부의 실시간 업데이트 페이지로 작업하지 않기 때문에 일반적으로 파이썬에는 문제가 없습니다. 그냥 파일이나 문자열에서 파싱 된 정적 DOM을 조작하는 것일 뿐이므로 찾고 있지 않은 동안 다른 코드가 DOM을 망치고 있지 않다는 것을 알 수 있습니다.

대부분의 경우이를 반영하도록 코드 구조를 변경하여 원하는 것을 얻을 수 있습니다. 이 경우를 들어, 다음과 같이 당신의 목표를 달성 할 수 있어야한다 :

fonts = doc.getElementsByTagName('font') 

for font in fonts: 
    # Create a new span 
    span = doc.createElement("span") 
    # Give it a class name based on the color (colors is a map) 
    span.setAttribute("class", colors[font.getAttribute("color")]) 

    # Place all the children inside 
    while(font.firstChild): 
     span.appendChild(font.firstChild) 
    # end while 

    # Replace the <font> with a the <span> 
    font.parentNode.replaceChild(span, font) 

아이디어는 대신 항상 fonts에서 첫 번째 요소에서 찾고, 당신은 각각의 반복과에 하나씩 교체하는 것이있다 시각.

이러한 차이 때문에 JavaScript DOM 코드가 이러한 종류의 즉석 DOM 업데이트를 사용하는 경우 동일한 DOM 호출을 사용하여 "축 어적"을 Python으로 이식 할 수 없습니다. 그러나, 상황이 당신의 발밑에서 덜 변하기 때문에 때때로 덜 동적 인 방식으로 그것을하는 것이 더 쉽습니다.

+0

나에게 움직이지 않는 것들이 때때로 쉽게 고통 스럽기 때문에 쉽게 만들 수 있다는 것에 동의한다. 다른 시간에, 내 원래 코드와 마찬가지로, 나는 그것을 활용합니다. :) – David

관련 문제