나는 어떻게 전체 또는 XML HTML 의 콘텐츠를 사용하여 요소 ElementTree?

StackOverflow https://stackoverflow.com/questions/380603

  •  22-08-2019
  •  | 
  •  

문제

즉,모든 텍스트와 하위 없이 태그의 요소가?

<p>blah <b>bleh</b> blih</p>

내가 원하는

blah <b>bleh</b> blih

요소입니다.텍스트"를 반환합 ㅋ"및 etree.tostring(요소)를 반환합니다:

<p>blah <b>bleh</b> blih</p>
도움이 되었습니까?

해결책 2

이 솔루션은 결국 사용:

def element_to_string(element):
    s = element.text or ""
    for sub_element in element:
        s += etree.tostring(sub_element)
    s += element.tail
    return s

다른 팁

ElementTree 완벽하게 작동,당신은 대답이다.무언가가 다음과 같이...

"".join( [ "" if t.text is None else t.text ] + [ xml.tostring(e) for e in t.getchildren() ] )

감사 JV amd PEZ 포트에 대한 오류가 있습니다.


집니다.

>>> import xml.etree.ElementTree as xml
>>> s= '<p>blah <b>bleh</b> blih</p>\n'
>>> t=xml.fromstring(s)
>>> "".join( [ t.text ] + [ xml.tostring(e) for e in t.getchildren() ] )
'blah <b>bleh</b> blih'
>>> 

꼬리를 필요하지 않습니다.

이들은 좋은 답변 응답하는 영업 이익의 질문을 하는 경우에 특히 질문에 국한되 HTML.하지만 문서는 본질적으로 지저분하고,깊이의 요소 중첩은 일반적으로 예측 불가능.

시뮬레이션 DOM 의 getTextContent()를 사용하는 것(아주)간단한 재귀적 메커니즘이 있습니다.

을 얻을 벌거벗은 텍스트:

def get_deep_text( element ):
    text = element.text or ''
    for subelement in element:
        text += get_deep_text( subelement )
    text += element.tail or ''
    return text
print( get_deep_text( element_of_interest ))

하에 대한 모든 정보를 얻을 사이의 경계를 텍스트:

root_el_of_interest.element_count = 0
def get_deep_text_w_boundaries( element, depth = 0 ):
    root_el_of_interest.element_count += 1
    element_no = root_el_of_interest.element_count 
    indent = depth * '  '
    text1 = '%s(el %d - attribs: %s)\n' % ( indent, element_no, element.attrib, )
    text1 += '%s(el %d - text: |%s|)' % ( indent, element_no, element.text or '', )
    print( text1 )
    for subelement in element:
        get_deep_text_w_boundaries( subelement, depth + 1 )
    text2 = '%s(el %d - tail: |%s|)' % ( indent, element_no, element.tail or '', )
    print( text2 )
get_deep_text_w_boundaries( root_el_of_interest )

예 출력에서 단일 파라 텍스트 문자에 doc(.fodt 파일):

(el 1 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'Standard'})
(el 1 - text: |Ci-après individuellement la "|)
  (el 2 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T5'})
  (el 2 - text: |Partie|)
  (el 2 - tail: |" et ensemble les "|)
  (el 3 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T5'})
  (el 3 - text: |Parties|)
  (el 3 - tail: |", |)
(el 1 - tail: |
   |)

포인트 중 하나에 대한 어지러움이 없다는 것입 규칙에 대한 텍스트 스타일을 나타내는 단어 경계하고 할 때 그것:위 첨자 즉시 단어(공백 없는)의 별도의 말씀에서 모든 사용 사례를 수 있습니다.새로운 때로는 당신이 찾을 수 있습니다,예를 들어,문서 첫 번째 편지는 어느 굵게 어떤 이유로,또는 아마도 사용하여 다른 스타일에 대한 첫 글자를 나타내는 그것으로 상단 케이스,보다는 오히려 단순히 사용하여 정상적인 UC 문자입니다.

그리고 물론 더 적은 주로"영어 중심의"이 토론을 가져 더 큰 미묘한 복잡성!

내가 의심 ElementTree 은 것을 사용한다.하지만 가정은 당신이 강력한 이유를 사용하여 그것은 어쩌면 당신이 시도할 수 있습 벗기는 루트에서 태그 조각:

 re.sub(r'(^<%s\b.*?>|</%s\b.*?>$)' % (element.tag, element.tag), '', ElementTree.tostring(element))

답변의 대부분은 여기에 기반 XML parser ElementTree, 도 PEZ 의 regex 기반 응답 아직도 부분적으로 의존하에 ElementTree.

모든 사람들은 좋은 적합한 대부분의 경우 하지만,완전성을 위해,그것은 주목할 가치가있다, ElementTree.tostring(...) 신 동등한 조각은,항상은 아니지만 동일하게 원래 페이로드를 사용합니다.는 경우,어떤 매우 드문 이유로,당신을 추출하고 싶은 콘텐츠는 그대로,당신은 당신을 사용하여 순수한 정규 표현식 기반 솔루션입니다. 이 예제 가 사용하는 방법에 정규식 기반 솔루션입니다.

아무 생각하는 경우 외부 라이브러리 옵션이 될 수 있습니다,하지만 어쨌든--이 있다고 가정하면 중 하나입 <p> 이 페이지에서 텍스트,jQuery-솔루션이 될 것이다:

alert($('p').html()); // returns blah <b>bleh</b> blih
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top