2017-04-11 120 views
0

我有一个SGML文件,它混合了需要关闭的标签和那些不需要的标签。 BeautifulSoup可以对此进行美化,但我的标签是自定义的,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

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

FILERCOMPANY-DATA需要关闭标签和别人不一样。

我该如何告诉BeautifulSoup的解析器在行尾关闭某些标签?它是否与BS处理brliadiv有什么关系?

+0

BeautifulSoup正在解析和提取格式不正确的HTML/XML, 中的数据,但如果破损的HTML不明确,那么它会使用一组规则来解释标记。这是你不想要的东西。 为什么不使用正则表达式来解析文件而不是BeautifulSoup? –

+0

@ChristosPapoulas对于自定义标签,BeautifulSoup在构造函数中有'selfClosingTags'参数('BeautifulSoup()')。它不在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 
) 

仍然好奇如何操纵在树构建标记属性。