은">"(U+003E GREATER-이상호)내에서 허용하는 html 요소 속성 값은?
문제
다시 말해서도 하나 사용 /<tag[^>]*>.*?<\/tag>/
regex 치 tag
html 요소를 포함하지 않는 중첩 tag
요소는?
예를 들어(lt.html):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>greater than sign in attribute value</title>
</head>
<body>
<div>1</div>
<div title=">">2</div>
</body>
</html>
Regex:
$ perl -nE"say $1 if m~<div[^>]*>(.*?)</div>~" lt.html
과 스크린-스크레이퍼:
#!/usr/bin/env python
import sys
import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(sys.stdin)
for div in soup.findAll('div'):
print div.string
$ python lt.py <lt.html
모두 동일한 출력:
1
">2
예상 출력:
1
2
w3c 말합니다:
특성 값은 혼합물의 텍스트 과 캐릭터를 참조하는 경우를 제외하고, 추가적인 제한 사항 텍스트 포함할 수 없습니다 모 앰퍼샌드.
해결책
네,그것이 허용하는(W3C 검사기지 그것만이 문제가 경고).
이스케이프 <
고 >
또한 허용된 내부 의견이기 때문에,이러한 간단한 regexp 할 수 있는 바보짓을 할 수 있습니다.
는 경우 BeautifulSoup 지 않을 처리할 수 있는 버그 또는 아마도 의식적인 디자인이 결정을 더 탄력있는 누락에 닫에 따옴표 속성이 있습니다.
다른 팁
내가 믿는 그의 유효와 W3C 검사기 동의하고,그러나 신뢰할 수 있는 소스에 대한 이 정보는 ISO8879:1986 기준,비용~150EUR/210USD.에 관계없이,그것은 잘못을 인코딩하는,그래서 의심스러운 경우 인코딩.또한,사용하는 경우에는 XML 기반의 문서 형식 필요하신을 인코딩하는 기호에서 순서 ]]>
.
리터럴 >
법적 어디에서나 html 콘텐츠 안에 특성 값과 같은 텍스트 요소 내에서.
을 읽은 후에 다음과 같다:
http://www.w3.org/International/questions/qa-escapes
그것은 다음과 같은 엔터티 이스케이프는 제안된 어디서나(을 포함한 특성에서)한 < >와&
당신이 주장하는 경우에 정규 표현식을 사용하여(이에 적절한 기본 문자열 작업)을 사용하여 시험 <tag((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>.*?<\/tag>
.치해야 한다는 속성을 완벽하게 따라서 액세스할 수 있도록 합 안 콘텐츠(지만 당신은 그것을 둘 필요가에서 캡처 그룹).
사용할 수도 있습니다 Html 민첩성 Pack 에 대한 구문 분석 HTML 권하고 싶다면 당신이해야 할 많은의 분석.유지 큰 정기적인 표현을 쉽게 될 수 있다는 두통이지만,그 사이에 그들은 또한 훨씬 더 효과적인 경우는 그렇게 할 수 있습니다.
yeah except /<tag[^>]*>.*?<\/tag>/
이 일치하지 않을 하나의 태그하지만,일 처음 시작 태그와 마지막 끝 태그를 주는 태그이다.처럼 당신의 첫 번째 비 욕심 tag-치 사이에 작성해야 합 non-greedy as well.
당신 같은 결과를 얻을 사용하여>대신>