2012-08-15 2 views
2

에는 속성 '항목을'이 없으며 (http://djangosnippets.org/snippets/1655/에 의해 거의 전적으로), 나는 아래의 코드를 사용하고 입력에서 속성 :'목록'객체는 파이썬의 BeautifulSoup로의 renderContents 원치 않는/안전하지 않은 태그를 제거하기위한 시도에서

def html_filter(value, allowed_tags = 'p h1 h2 h3 div span a:href:title img:src:alt:title table:cellspacing:cellpadding th tr td:colspan:rowspan ol ul li br'): 
    js_regex = re.compile(r'[\s]*(&#x.{1,7})?'.join(list('javascript'))) 
    allowed_tags = [tag.split(':') for tag in allowed_tags.split()] 
    allowed_tags = dict((tag[0], tag[1:]) for tag in allowed_tags) 
    soup = BeautifulSoup(value) 
    for comment in soup.findAll(text=lambda text: isinstance(text, Comment)): 
     comment.extract() 
    for tag in soup.findAll(True): 
     if tag.name not in allowed_tags: 
      tag.hidden = True 
     else: 
      tag.attrs = [(attr, js_regex.sub('', val)) for attr, val in tag.attrs.items() if attr in allowed_tags[tag.name]] 
    return soup.renderContents().decode('utf8') 

불필요하거나 허용 된 태그, 허용되지 않는 HTML, 심지어 형식이 잘못된 HTML 태그에도 잘 작동합니다. 그러나 허용 목록에있는 속성이 있으면 마지막 줄에

'list' object has no attribute 'items' 

을 발생시켜 도움이되지 않습니다. type(soup)은 오류 발생 여부와 상관없이 <class 'bs4.BeautifulSoup'>입니다. 그래서 나는 그것이 무엇을 언급하는지 알지 못합니다.

Traceback: 
[...] 
File "C:\Users\Mark\Web\www\fnwidjango\src\base\functions\html_filter.py" in html_filter 
    30.  return soup.renderContents().decode('utf8') 
File "C:\Python27\lib\site-packages\bs4\element.py" in renderContents 
    1098.    indent_level=indentLevel, encoding=encoding) 
File "C:\Python27\lib\site-packages\bs4\element.py" in encode_contents 
    1089.   contents = self.decode_contents(indent_level, encoding, formatter) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode_contents 
    1074.         formatter)) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode 
    1021.    indent_contents, eventual_encoding, formatter) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode_contents 
    1074.         formatter)) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode 
    1021.    indent_contents, eventual_encoding, formatter) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode_contents 
    1074.         formatter)) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode 
    1021.    indent_contents, eventual_encoding, formatter) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode_contents 
    1074.         formatter)) 
File "C:\Python27\lib\site-packages\bs4\element.py" in decode 
    983.    for key, val in sorted(self.attrs.items()): 

Exception Type: AttributeError at /"nieuws"/article/3-test/ 
Exception Value: 'list' object has no attribute 'items' 
+0

'tag.attrs'는 사전이 아니겠습니까? (하나부터 시작해서 목록으로 바꿨다) – mgilson

+0

왜 내가 그걸 바꿨는지 기억하고있다. 내가 다시 바꿨을 때 아무 것도 고장난 것 같지 않다. 아마 내 뇌 기능이 제대로 작동하지 않았을 것이다. – Mark

답변

3

시도

tag.attrs = dict((attr, js_regex.sub('', val)) for attr, val in tag.attrs.items() if attr in allowed_tags[tag.name]) 
1

tag.attrs = [(attr, js_regex.sub('', val)) for attr, val in tag.attrs.items() if attr in allowed_tags[tag.name]] 

교체 renderContents() 오히려 목록보다, 당신이 (AN items 방법을 것이다)을 dictattrs을 설정하는 기대 것 같습니다 당신이 통과하는 튜플. 따라서 액세스하려고하면 AttributeError이 발생합니다.

오류를 해결하려면, 당신은 파이썬 3의 DICT 이해를 사용할 수 있습니다

tag.attrs = {attr: js_regex.sub('', val)) for attr, val in tag.attrs.items() if attr in allowed_tags[tag.name]} 

를 파이썬 2에서, DICT 함축가 지원되지 않습니다 당신이 dict 생성자에 반복자를 통과해야하므로 :

tag.attrs = dict((attr, js_regex.sub('', val)) for attr, val in tag.attrs.items() if attr in allowed_tags[tag.name]))