【问题标题】:How to define a custom tag's properties in BeautifulSoup?如何在 BeautifulSoup 中定义自定义标签的属性?
【发布时间】:2017-09-07 10:22:12
【问题描述】:

我有一个 SGML 文件,其中混合了需要关闭和不需要关闭的标签。 BeautifulSoup 可以为 HTML 美化它,但我的标签是自定义的,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 有什么关系?

【问题讨论】:

  • BeautifulSoup 正在从格式错误的 HTML/XML 中解析和提取数据,但如果损坏的 HTML 不明确,那么它会使用一组规则来解释标签。这是你不想要的。为什么不使用正则表达式而不是 BeautifulSoup 来解析文件?
  • @ChristosPapoulas 对于自定义标签,BeautifulSoup 在构造函数中有selfClosingTags 参数(BeautifulSoup())。 BeautifulSoup4 中没有。例如,参见stackoverflow.com/questions/14961497/…。 BS4 说“树生成器负责理解自闭合标签”,但是如何设置它们呢?
  • stackoverflow.com/questions/12505419/… 你可能会感兴趣。

标签: python html parsing beautifulsoup sgml


【解决方案1】:

我没有找到如何在 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
)

仍然好奇如何在树构建器中操作标签属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多