2012-01-28 4 views
4

나는 MS FrontPage에서 생성 된 웹 사이트의 html을 'defrontpagify'하려고하는데, 그것을 수행하기 위해 BeautifulSoup 스크립트를 작성하고 있습니다.BeautifulSoup : 지정된 속성을 제거하지만 태그와 내용을 보존합니다.

그러나 태그가 포함 된 문서의 모든 태그에서 특정 속성 (또는 목록 속성)을 제거하려고하는 부분에 갇혀 있습니다. 코드 스 니펫

REMOVE_ATTRIBUTES = ['lang','language','onmouseover','onmouseout','script','style','font', 
         'dir','face','size','color','style','class','width','height','hspace', 
         'border','valign','align','background','bgcolor','text','link','vlink', 
         'alink','cellpadding','cellspacing'] 

# remove all attributes in REMOVE_ATTRIBUTES from all tags, 
# but preserve the tag and its content. 
for attribute in REMOVE_ATTRIBUTES: 
    for tag in soup.findAll(attribute=True): 
     del(tag[attribute]) 

오류없이 실행되지만 실제로는 속성을 제거하지 않습니다. 내가 외부 루프없이 실행하면 바로 하드 하나의 속성 (soup.findAll ('스타일'= true)를 코딩, 그것을 작동

누구나 여기에 문제를 알고 볼

PS -.? 내가 돈 ' 사람이 더 많은 기능,지도/필터 틱 스타일을 알고있는 경우 t 그다지 중첩 루프 등., 나는 그것을보고 싶어요.

+1

'soup.findAll (attribute = True)'가 단순히'soup.findAll()'으로 변경되면 작동한다. – mzjn

+0

좋은 캐치, 실제로 작동합니다. 뒤늦게 보아도 분명히 속성 값을 두 번 확인할 필요는 없습니다. 문제는 문서의 모든 태그의 모든 속성을 확인하고 실행하는 데 2 ​​배의 시간이 걸리지 만 ~ 15 페이지의 경우 5 초와 2.5 초가 중요하지 않습니다. – Kurtosis

답변

6

라인

for tag in soup.findAll(attribute=True): 

어떤 tag의를 찾을 수 없습니다. findAll을 사용할 수있는 방법이 있을지 모르지만, 이 작품 : 나는 파이썬 2.7 나 tag.attrs에 대한 BeautifulSoup로 4를 사용하고

import BeautifulSoup 
REMOVE_ATTRIBUTES = [ 
    'lang','language','onmouseover','onmouseout','script','style','font', 
    'dir','face','size','color','style','class','width','height','hspace', 
    'border','valign','align','background','bgcolor','text','link','vlink', 
    'alink','cellpadding','cellspacing'] 

doc = '''<html><head><title>Page title</title></head><body><p id="firstpara" align="center">This is <i>paragraph</i> <a onmouseout="">one</a>.<p id="secondpara" align="blah">This is <i>paragraph</i> <b>two</b>.</html>''' 
soup = BeautifulSoup.BeautifulSoup(doc) 
for tag in soup.recursiveChildGenerator(): 
    try: 
     tag.attrs = [(key,value) for key,value in tag.attrs 
        if key not in REMOVE_ATTRIBUTES] 
    except AttributeError: 
     # 'NavigableString' object has no attribute 'attrs' 
     pass 
print(soup.prettify()) 
+0

충분히 좋습니다. 감사합니다. findAll에 관해서는, 나는 그 속성 이름을 하드 코딩하는 것이 효과가 있기 때문에 어쨌든'attribute' 변수를 잘못 참조하고 있다고 확신합니다. 전체 스크립트 작업을 마친 후 다음 패스에서 더 자세히 살펴볼 것입니다. – Kurtosis

3

사전보다는 목록입니다. 그러므로 나는이 코드를 수정해야만했다 :

관련 문제