2017-04-11 7 views
0

닫을 필요가있는 태그와 그렇지 않은 태그를 혼합 한 SGML 파일이 있습니다. BeautifulSoup는 HTML에 대해 이것을 가장 잘 나타낼 수 있지만 태그는 custom이고 BeautifulSoup은 파일 끝 부분에서이를 닫습니다. 여기에 소스입니다 :BeautifulSoup에서 맞춤 태그의 속성을 정의하는 방법은 무엇입니까?

from bs4 import BeautifulSoup 
import requests 

url = 'https://www.sec.gov/Archives/edgar/data/1122304/000119312515118890/0001193125-15-118890.hdr.sgml' 
sgml = requests.get(url).text 
soup = BeautifulSoup(sgml, 'html5lib') 

그리고 여기 file의 : FILERCOMPANY-DATA 닫는 태그가 필요하고 다른 사람이하지 않는

<SEC-HEADER>0001193125-15-118890.hdr.sgml : 20150403 
<ACCEPTANCE-DATETIME>20150403143902 
<ACCESSION-NUMBER>0001193125-15-118890 
<TYPE>DEF 14A 
<PUBLIC-DOCUMENT-COUNT>37 
<PERIOD>20150515 
<FILING-DATE>20150403 
<DATE-OF-FILING-DATE-CHANGE>20150403 
<EFFECTIVENESS-DATE>20150403 
<FILER> 
<COMPANY-DATA> 
<CONFORMED-NAME>AETNA INC /PA/ 
<CIK>0001122304 
<ASSIGNED-SIC>6324 
<IRS-NUMBER>232229683 
<STATE-OF-INCORPORATION>PA 
<FISCAL-YEAR-END>1231 
</COMPANY-DATA> 
... 
</SEC-HEADER> 

.

줄 끝에있는 특정 태그를 닫으려면 BeautifulSoup의 파서에게 어떻게 알릴 수 있습니까? BS가 brliadiv을 처리하는 방법과 관련이 있습니까?

+0

BeautifulSoup은 형식이 잘못된 HTML/XML 인 에서 데이터를 파싱하고 추출하지만 깨진 HTML이 모호한 경우 규칙 집합을 사용하여 태그를 해석합니다. 이것은 당신이 원하지 않는 것입니다. BeautifulSoup 대신 파일을 구문 분석하기 위해 정규식을 사용하지 않는 이유는 무엇입니까? –

+0

@ChristosPapoulas 커스텀 태그의 경우, BeautifulSoup는 생성자 ('BeautifulSoup()')에'selfClosingTags' 매개 변수를 가지고 있습니다. BeautifulSoup4에는 없습니다. 예 : http://stackoverflow.com/questions/14961497/how-to-get-beautifulsoup-4-to-respect-a-self-closing-tag를 참조하십시오. BS4는 "트리 빌더는 자기 닫는 태그를 이해할 책임이 있습니다"라고 말하면서 어떻게 설정합니까? –

+1

http://stackoverflow.com/questions/12505419/parse-sgml-with-open-arbitrary-tags-in-python-3/12534420#12534420이 관심의 대상 일 수 있습니다. –

답변

0

BeautifulSoup에서 트리 빌더를 제어하는 ​​방법을 찾지 못했습니다. 방금 열린 태그를 @ChristosPapoulas가 제안한 것처럼 정규 표현식으로 닫고 XML 파일로 끝냈습니다.

내가 질문에 있던 코드에 추가 : 트리 빌더에서

# Find all tags 
all_tags = re.findall(
    r'<([^>/]+)>', 
    sgml 
) 

# Find closed tags 
closed_tags = re.findall(
    r'</([^>]+)>', 
    sgml 
) 

# Deduce open tags 
open_tags = [x for x in all_tags if x not in closed_tags] 

# Closing open tags knowing that each of them takes just one line 
sgml_xml = re.sub(
    r'(<({})>.*)'.format('|'.join(open_tags)), 
    r'\1</\2>', 
    sgml 
) 

조작하는 방법을 여전히 호기심 태그 속성을.

관련 문제