2017-04-11 17 views
0

私はクローズが必要なタグとそうでないタグを混在させたSGMLファイルを持っています。 BeautifulSoupはこれをHTMLで誇張することができますが、私のタグはカスタムであり、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がbrliを対価として扱う方法とは何かがありますか、adivですか?

+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 
) 

それでも好奇心:私は疑問に持っていたコードに追加

関連する問題