스터디/Etc

Beautiful Soup Parser차이 (html.parser, xml, lxml, html5lib)

Dalmangyi 2022. 8. 15.

 

파서의 차이점 

Beautiful Soup은 여러 다른 파서에 동일한 인터페이스를 제공하지만 각 파서는 다릅니다. 

다른 파서는 동일한 문서에서 다른 파스 트리를 생성합니다. 

가장 큰 차이점은 HTML 파서와 XML 파서 사이에 있습니다.

 

 

html.parser 

다음은 Python과 함께 제공되는 파서를 사용하여 HTML로 구문 분석된 짧은 문서입니다.

BeautifulSoup("<a><b/></a>", "html.parser")
# <a><b></b></a>

독립형 <b/> ​​태그는 유효한 HTML이 아니므로 html.parser는 이를 <b></b> 태그 쌍으로 바꿉니다.

 

 

xml

다음은 XML로 구문 분석된 동일한 문서입니다. (이를 실행하려면 lxml이 설치되어 있어야 함) 

독립형 <b/> ​​태그는 그대로 남아 있으며 문서에는 <html> 태그에 넣지 않고 XML 선언(<?xml version="1.0" encoding="utf-8"?>이 제공됩니다.

print(BeautifulSoup("<a><b/></a>", "xml"))
# <?xml version="1.0" encoding="utf-8"?>
# <a><b/></a>

 

HTML 파서 간에도 차이점이 있습니다. 

Beautiful Soup에 완벽한 형식의 HTML 문서를 제공하면 이러한 차이점은 중요하지 않습니다. 

하나의 파서는 다른 것보다 빠르지만 모두 원본 HTML 문서와 똑같은 데이터 구조를 제공합니다.

 

그러나 문서가 완벽하게 구성되지 않은 경우, 파서가 서로 다른 결과를 제공합니다. 

 

 

 

 

 

lxml

다음은 lxml의 HTML 파서를 사용한 문서(<a></p>)입니다. 

<a> 태그는 <body> 및 <html> 태그로 둘러싸이고, 시작이 없는 </p> 태그는 단순히 무시됩니다.

BeautifulSoup("<a></p>", "lxml")
# <html><body><a></a></body></html>

 

 

html5lib

다음은 html5lib를 사용하여 구문 분석한 동일한 문서입니다.

BeautifulSoup("<a></p>", "html5lib")
# <html><head></head><body><a><p></p></a></body></html>

</p> 태그를 무시하는 대신 html5lib는 이를 여는 <p> 태그를 추가하여 쌍을 이루게 만듭니다.

html5lib는 또한 비어있는 <head> 태그를 추가합니다.

 

 

html.parser

다음은 Python의 내장 HTML 파서로 구문 분석한 동일한 문서입니다.

BeautifulSoup("<a></p>", "html.parser")
# <a></a>

lxml과 마찬가지로 이 파서는 닫는 </p> 태그를 무시합니다. 
html5lib 또는 lxml과 달리 이 파서는 <html> 또는 <body> 태그를 추가하여 올바른 형식의 HTML 문서를 만들려고 하지 않습니다.

"<a></p>"가 유효하지 않기 때문에 이러한 기술 중 어느 것도 이를 처리하는 '올바른' 방법이 아닙니다. 

 

html5lib 파서는 HTML5 표준의 일부인 기술을 사용하므로 '올바른' 방식이라고 주장하지만 세 가지 기술 모두 합법적입니다.

 

파서 간의 차이가 스크립트에 영향을 줄 수 있습니다. 

스크립트를 다른 사람에게 배포하거나 여러 컴퓨터에서 실행할 계획이라면 BeautifulSoup 생성자에서 파서를 지정해야 합니다. 

그러면 사용자가 문서를 구문 분석하는 방식과 다르게 구문 분석할 가능성이 줄어듭니다.

 

 

 

 

 

 

 

 

=> async, aiohttp

 

 

출처 : https://www.crummy.com/software/BeautifulSoup/bs4/doc/#differences-between-parsers

댓글