2012-12-05 4 views
0

사용 파이썬 3.3 일부 정규 표현식을 대체하지 못했습니다.HTML td 태그에서 모든 속성을 제거하는 방법 (파이썬에서 rowspan)?

은 내가 rowspan 속성 (끝에서 예 TD 년대)를 제외하고는 td 태그의 모든 속성을 제거하고자합니다. rowspan이 존재 때 성공적으로 대체 할 수있는 다음 명령을 사용하여

: handle_td

re.sub('(<td)[^>]*([\\s]rowspan[\\s]*=[\\s]*[0-9]*)[^>]*(>)', handle_td, file_contents) 

:

def handle_td(matchobj): 
    new_td = '' 
    for curr_group in matchobj.groups(''): 
     if curr_group != '': 
      new_td += curr_group 
    return new_td 

하지만이 td 년대의 나머지 돌봐도합니다. 이것은 내가 관리하지 못했습니다.

두 번째 그룹 뒤에 ?을 추가하면 td 태그가 변경되고 rowspan 특성이 유지되지 않습니다.

내가 뭘 잘못하고 있니? 이 문제를 어떻게 해결할 수 있습니까? 이

내가 다른 td 년대를 처리하기 위해 다른 명령을 실행 채굴하지 않습니다하지만 난하지 못했다을 ... 생산한다

<td width=307 valign=top style='width:230.3pt;border:solid windowtext 1.0pt; border-left:none;padding:0cm 5.4pt 0cm 5.4pt'> 
<td width=307 rowspan=4 style='width:230.3pt;border:solid windowtext 1.0pt; border-top:none;padding:0cm 5.4pt 0cm 5.4pt'> 
<td width=307 valign=top style='width:230.3pt;border-top:none;border-left: none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; padding:0cm 5.4pt 0cm 5.4pt'> 

:

<td> 
<td rowspan=4> 
<td> 

이 방법으로 관리했습니다 (더 나은 방법을 사용하면을 자유롭게 추가 할 수 있습니다. ). ROWSPAN 코드가 선택 될 때

# Leave only specific attributes for td tags 
def filter_td_attributes(matchobj): 
    if matchobj.group(1) == "rowspan": 
     return matchobj.group(1) + '=' + matchobj.group(2) 

# Loop the attributes of the td tags 
def handle_td(matchobj): 
    new_td = re.sub("([a-zA-Z]+)[\\s]*=[\\s]*([a-zA-Z0-9:;.\\-'\\s]*)([\\s]|>)", filter_td_attributes, matchobj.group(0)) 
    new_td = re.sub("[\\s]*$", '', new_td) 
    new_td = new_td + ">" # close the td tag 
    return new_td 

file_contents = re.sub('[\\s]*</p>[\\s]*</td>', '</td>', file_contents) 
+2

망가 구문 분석 HTML/XML "여전히 전체 정규 표현식 매치를하면서 가능한 문자"

비 욕심 버전 ([^>]*?)을 의미

> "나에게 비의 수를 최소로 줄". 파서를 사용하면 훨씬 쉬울 것입니다. – kreativitea

+4

필수 참조 : http://stackoverflow.com/a/1732454/1350899 – mata

+1

대신 [Beautiful Soup] (http://www.crummy.com/software/BeautifulSoup/)을 사용하십시오. – will

답변

0

당신은 코드의 [^>]* 부분이 아닌 욕심 확인해야합니다 : 그것은 [^>]*?합니다. 모두 함께이된다 :

욕심 버전 ( [^>]*)을 의미
'(<td)[^>]*?([\\s]rowspan[\\s]*=[\\s]*[0-9]*)?[^>]*(>)' 

는 "가능한 문자,하지만 난 영을 받아 들일 것"> "나에게 많은 비를 제공합니다." 정규식

+0

고마워, 나는 노력했지만 작동하지 않았다. – SimonW

+0

어쨌든, 가장 중요한 것은 작동하는 것을 얻었습니다.나는 또한 정말로 필요하지 않은 "여분의"것들을 발견했습니다.'\\ s' 값 주위의 대괄호는 아무 것도하지 않고''주변의 괄호는 실제로 필요하지 않습니다. 정적 텍스트를 동적으로 캡쳐 할 필요가 있습니다 (그리고 캐릭터 그룹을'( EvilBob22

+0

답변을 주셔서 감사합니다. 대괄호는 그룹화를위한 것이므로 코드에서 해당 그룹의 콘텐츠를 사용할 수 있습니다. – SimonW

관련 문제