使用Regex + BeautifulSoup抓取XML并将其存储到Pandas

MSD:

我正在使用beautifulSoup抓取一些xml站点,然后将抓取的数据存储到数据帧中。XML通常采用统一格式,因此抓取效果很好。但是也许有15%的时间,数据不会保存到数据帧中,因为其中一个前缀略有不同。

例如,在抓取这三个URL时,第二个和第三个URL会毫无问题地存储到数据帧中,而第一个则没有。

from bs4 import BeautifulSoup
import requests
import pandas as pd

session = requests.Session()

# urls to loop through
form_urls = ['https://www.sec.gov/Archives/edgar/data/1418814/000141881220000017/vac13f021420.xml',
             'https://www.sec.gov/Archives/edgar/data/820124/000095012320003895/408.xml',
             'https://www.sec.gov/Archives/edgar/data/1067983/000095012320002466/form13fInfoTable.xml']

# Create dataframe and set columns to match XML doc
cols = ['nameOfIssuer', 'titleOfClass', 'cusip', 'value', 'sshPrnamt',
        'sshPrnamtType', 'putCall', 'investmentDiscretion',
        'otherManager', 'Sole', 'Shared', 'None']

res_df = pd.DataFrame(columns=cols)


# Iterate over URLs
for form_url in form_urls:
    data = []
    soup = BeautifulSoup(session.get(form_url).content, 'lxml')
    print(soup)

    for info_table in soup.find_all(['ns1:infotable', 'infotable']):
        row = []
        for col in cols:
            d = info_table.find([col.lower(), 'ns1:' + col.lower()])
            row.append(d.text.strip() if d else 'NaN')
        data.append(row)
    url_df = pd.DataFrame(data, columns=cols)
    res_df = res_df.append(url_df, ignore_index=True)

print(res_df)

因此,如果前缀采用非预期格式(例如,它可能是空字符串或其他大小写字母和数字的组合),如何使刮板更加灵活?

游戏 :

您提供的第一个链接的第二行为n1:infoTable,而不是ns1:infoTable,因此,为了使代码正常工作,您需要考虑到这一点。

from bs4 import BeautifulSoup
import requests
import pandas as pd
import re


session = requests.Session()

# urls to loop through
form_urls = ['https://www.sec.gov/Archives/edgar/data/1418814/000141881220000017/vac13f021420.xml',
             'https://www.sec.gov/Archives/edgar/data/820124/000095012320003895/408.xml',
             'https://www.sec.gov/Archives/edgar/data/1067983/000095012320002466/form13fInfoTable.xml']

# Create dataframe and set columns to match XML doc
cols = ['nameOfIssuer', 'titleOfClass', 'cusip', 'value', 'sshPrnamt',
        'sshPrnamtType', 'putCall', 'investmentDiscretion',
        'otherManager', 'Sole', 'Shared', 'None']

res_df = pd.DataFrame(columns=cols)


# Iterate over URLs
for form_url in form_urls:
    data = []
    soup = BeautifulSoup(session.get(form_url).content, 'lxml')

    for info_table in soup.find_all(re.compile("([A-Za-z0-9]+:|)infotable")):
        row = []
        for col in cols:
            pattern = re.compile("([A-Za-z0-9]+:|)" + col.lower())
            d = info_table.find(pattern)
            row.append(d.text.strip() if d else 'NaN')
        data.append(row)
    url_df = pd.DataFrame(data, columns=cols)
    res_df = res_df.append(url_df, ignore_index=True)

编辑:现在前缀可以不存在(空字符串“”),也可以是小写,大写字母和数字的组合

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Beautifulsoup获取数据并将其存储到字典Python中

如何使用换行符读取字符串并将其存储到Pandas数据框或python列表中

我正在尝试使用scrapy抓取网站并将已抓取的数据存储到item类的变量中

使用BeautifulSoup提取表行并将其与Pandas数据框同步

如何在python中使用minidom获取元素值并将其存储到列表中?

无法使用php上传图像并将其存储到数据库

ssh到机器并使用shell脚本运行linux命令并将其存储在文件中

如何使用Laravel检索JSON数据并将其存储到数据库中

Shell脚本-获取CPU使用率(%cpu)并将其存储到变量中

如何使用OpenCV Java压缩图像并将其存储到特定文件夹

如何使用Reactjs获取CSV数据并将其存储到状态?

如何阅读每个单词并将其存储到变量中以供使用?

使用BeautifulSoup到Dataframe进行Web抓取

使用POST方法下载XML文件并将其存储在文档目录中

合并2个XML并使用Java提取此数据并将其存储在db表中

使用RegEx之后,可以在字符串中使用特定元素并将其存储在变量中吗?

使用XSLT删除XML中的子节点并将其数据复制到父节点

使用AJAX从XML提取信息并将其发布到HTML

使用 selenium 从 web 中提取数据并将其插入到 pandas 数据框中

如何使用python从html表中通过Web抓取数据并将其存储在csv文件中。我可以提取某些部分,但不能提取其他部分

如何使用for循环从文本文件中提取数据并将其存储到新文件中?

如何使用Javascript根据页面URL显示2个随机数并将其存储到用户缓存中?

如何使用jQuery读取外部HTML文件并将其存储到字符串变量?显示错误

使用正则表达式拆分字符串并将其存储到数据帧中

如何使用python传递两个或多个列表并将其存储到mysql数据库

如何读取使用FormData和Ajax从表单发送的数据并将其存储到本地文件夹?

使用JAVASCRIPT / PHP获取Mac和本地PC的IP地址并将其存储到数据库中?

如何使用 AWS CDK 获取现有的 EC2 实例 ID 并将其存储到数组

我想使用 PL/SQL 输入日期并将其存储到变量中,但收到 PL-00201 错误