如何排列不同结构的html句子

2024-10-04 11:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几百个html文件,如下所示。你知道吗

<nonDerivativeTable>
    <nonDerivativeHolding> #First Holding
        <securityTitle>
            <value>Stock</value>
        </securityTitle>
    </nonDerivativeHolding>
    <nonDerivativeHolding> #Second Holding
        <securityTitle>
            <footnoteId id="F1"/>
        </securityTitle>
    </nonDerivativeHolding>
    <nonDerivativeHolding> #Third Holding
        <securityTitle>
            <value>Option</value>
            <footnoteId id="F2"/>
            <footnoteId id="F3"/>
        </securityTitle>
    </nonDerivativeHolding>
</nonDerivativeTable>

我想提取的两个变量是安全性(‘股票’在#第一控股,’在#第二控股,’在#第三控股,’期权’)和安全性#脚注(’在#第一控股,’F1;F2’在#第二控股,’F3’在#第三控股。但是securityTitle和securityTitleFootnote并不总是存在。 此外,有时也会有多个脚注ID,就像第三个保持中的那样。 我想使用每个“Holding”标记中的数据编写每个rwo,允许空值。你知道吗

import csv
from bs4 import BeautifulSoup

with open('output.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile, )
    soup = BeautifulSoup(doc, 'htmparser') #Let's say doc has the html.

    try:
        securityTitles = soup.select('securityTitle > value').text
    except:
        securitiyTitles = ''
    try: 
        securityTitleFootnotes = '; 'join(soup.select('securityTitle > footnoteid').get('id')
    except:
        securityTitleFootnotes = ''

    for securityTitle, securityTitleFootnote in zip(securitiyTitles, securityTitleFootnotes):
        writer.writerow([securityTitle, securityTitleFootnote])

我希望结果是

Want Table

注意:我试图解析的一个url是“https://www.sec.gov/Archives/edgar/data/12927/0001225208-09-018738.txt”。我上传的句子只是数据的一部分。 现在我看到那些是XML。。。而不是HTML。你知道吗


Tags: csvidvaluehtmlwriterf2f1soup
1条回答
网友
1楼 · 发布于 2024-10-04 11:34:14

您可以找到每个nonDerivativeHolding的内容,然后为每个nonDerivativeHolding应用处理程序的自定义列表:

from bs4 import BeautifulSoup as soup
c = [i.securitytitle.contents for i in soup(s, 'html.parser').find_all('nonderivativeholding')]
h = [('value', lambda x:x.text), ('footnoteid', lambda x:x['id'])]
results = [[i for i in b if i != '\n'] for b in c]
r = [{a:(lambda x:'' if not x else x[0] if len(x) == 1 else x)([b(j) for j in i if j.name == a]) for a, b in h} for i in results]

输出:

[{'value': 'Stock', 'footnoteid': ''}, {'value': '', 'footnoteid': 'F1'}, {'value': 'Option', 'footnoteid': ['F2', 'F3']}]

相关问题 更多 >