Beautiful Soup是一个用于解析HTML / XML的Python包。此软件包的最新版本是版本4,导入为bs4。
我想使用单元格中包含嵌套表格的表格转换任何 html。 当我尝试执行此操作时,嵌套表所在的行后面会出现其他行。 行数...
使用 BeautifulSoup 解析带有子节点的 SEC EDGAR XML 表单数据
我正在尝试使用漂亮的 soup 和 xml 从 SEC 的 N-PORT-P/A 表格中抓取个人基金持有量。典型的提交如下所示,[链接在此][1],如下所示: 我正在尝试使用 beautiful soup 和 xml 从 SEC 的 N-PORT-P/A 表格中抓取个人基金持有量。典型的提交如下所示,[链接在此][1],如下所示: <edgarSubmission xmlns="http://www.sec.gov/edgar/nport" xmlns:com="http://www.sec.gov/edgar/common" xmlns:ncom="http://www.sec.gov/edgar/nportcommon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <headerData> <submissionType>NPORT-P/A</submissionType> <isConfidential>false</isConfidential> <accessionNumber>0001145549-23-004025</accessionNumber> <filerInfo> <filer> <issuerCredentials> <cik>0001618627</cik> <ccc>XXXXXXXX</ccc> </issuerCredentials> </filer> <seriesClassInfo> <seriesId>S000048029</seriesId> <classId>C000151492</classId> </seriesClassInfo> </filerInfo> </headerData> <formData> <genInfo> ... </genInfo> <fundInfo> ... </fundInfo> <invstOrSecs> <invstOrSec> <name>ARROW BIDCO LLC</name> <lei>549300YHZN08M0H3O128</lei> <title>Arrow Bidco LLC</title> <cusip>042728AA3</cusip> <identifiers> <isin value="US042728AA35"/> </identifiers> <balance>115000.000000000000</balance> <units>PA</units> <curCd>USD</curCd> <valUSD>114754.170000000000</valUSD> <pctVal>0.3967552449</pctVal> <payoffProfile>Long</payoffProfile> <assetCat>DBT</assetCat> <issuerCat>CORP</issuerCat> <invCountry>US</invCountry> <isRestrictedSec>N</isRestrictedSec> <fairValLevel>2</fairValLevel> <debtSec> <maturityDt>2024-03-15</maturityDt> <couponKind>Fixed</couponKind> <annualizedRt>9.500000000000</annualizedRt> <isDefault>N</isDefault> <areIntrstPmntsInArrs>N</areIntrstPmntsInArrs> <isPaidKind>N</isPaidKind> </debtSec> <securityLending> <isCashCollateral>N</isCashCollateral> <isNonCashCollateral>N</isNonCashCollateral> <isLoanByFund>N</isLoanByFund> </securityLending> </invstOrSec> Arrow Bidco LLC 是投资组合中的债券,其一些特征包含在文件中(CUSIP、CIK、余额、到期日等)。我正在寻找迭代每个单独的证券 (investOrSec) 并收集数据框中每个证券的特征的最佳方法。 我当前使用的代码是: import numpy as np import pandas as pd import requests from bs4 import BeautifulSoup header = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36", "X-Requested-With": "XMLHttpRequest"} n_port_file = requests.get("https://www.sec.gov/Archives/edgar/data/1618627/000114554923004968/primary_doc.xml", headers=header, verify=False) n_port_file_xml = n_port_file.content soup = BeautifulSoup(n_port_file_xml,'xml') names = soup.find_all('name') lei = soup.find_all('lei') title = soup.find_all('title') cusip = soup.find_all('cusip') .... maturityDt = soup.find_all('maturityDt') couponKind = soup.find_all('couponKind') annualizedRt = soup.find_all('annualizedRt') 然后迭代每个列表,根据每行中的值创建一个数据框。 fixed_income_data = [] for i in range(0,len(names)): rows = [names[i].get_text(),lei[i].get_text(), title[i].get_text(),cusip[i].get_text(), balance[i].get_text(),units[i].get_text(), pctVal[i].get_text(),payoffProfile[i].get_text(), assetCat[i].get_text(),issuerCat[i].get_text(), invCountry[i].get_text(),couponKind[i].get_text() ] fixed_income_data.append(rows) fixed_income_df = pd.DataFrame(equity_data,columns = ['name', 'lei', 'title', 'cusip', 'balance', 'units', 'pctVal', 'payoffProfile', 'assetCat', 'issuerCat', 'invCountry' 'maturityDt', 'couponKind', 'annualizedRt' ], dtype = float) 当包含所有信息时,这种方法效果很好,但通常有一个变量未被考虑在内。表单的一部分可能是空白的,或者发行人类别可能未正确填写,从而导致 IndexError。该投资组合包含我能够解析的 127 种证券,但可能缺少单一证券的年化回报率,从而失去了整齐创建数据框的能力。 此外,对于同时持有固定收益和股票证券的投资组合,股票证券不会返回 DebtSecs 子项的信息。有没有一种方法可以迭代这些数据,同时以最简单的方式清理它?即使为权益证券未引用的 DebtSec 子项添加“NaN”也是有效的响应。任何帮助将不胜感激! [1]:https://www.sec.gov/Archives/edgar/data/1618627/000114554923004968/primary_doc.xml 在我看来,这是处理问题的最佳方法。一般来说,EDGAR 文件非常难以解析,因此以下内容可能适用于其他文件,也可能不适用于其他文件,即使来自同一文件管理器也是如此。 为了让自己更轻松,因为这是一个 XML 文件,所以您应该使用 xml 解析器和 xpath。鉴于您要创建一个数据框,最合适的工具是 pandas read_xml() 方法。 因为 XML 是嵌套的,所以您需要创建两个不同的数据帧并将它们连接起来(也许其他人对如何处理它有更好的想法)。最后,虽然 read_xml() 可以直接从 url 读取,但在这种情况下,EDGAR 需要使用用户代理,这意味着您还需要使用 requests 库。 所以,大家一起: #import required libraries import pandas as pd import requests url = 'https://www.sec.gov/Archives/edgar/data/1618627/000114554923004968/primary_doc.xml' #set headers with a user-agent headers = {"User-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"} req = requests.get(url, headers=headers) #define the columns you want to drop (based on the data in your question) to_drop = ['identifiers', 'curCd','valUSD','isRestrictedSec','fairValLevel','debtSec','securityLending'] #the filing uses namespaces (too complicated to get into here), so you need to define that as well namespaces = {"nport": "http://www.sec.gov/edgar/nport"} #create the first df, for the securities which are debt instruments invest = pd.read_xml(req.text,xpath="//nport:invstOrSec[.//nport:debtSec]",namespaces=namespaces).drop(to_drop, axis=1) #crete the 2nd df, for the debt details: debt = pd.read_xml(req.text,xpath="//nport:debtSec",namespaces=namespaces).iloc[:,0:3] #finally, concatenate the two into one df: pd.concat([invest, debt], axis=1) 这应该输出您的 126 种债务证券(请原谅格式): lei title cusip balance units pctVal payoffProfile assetCat issuerCat invCountry maturityDt couponKind annualizedRt 0 ARROW BIDCO LLC 549300YHZN08M0H3O128 Arrow Bidco LLC 042728AA3 115000.00 PA 0.396755 Long DBT CORP US 2024-03-15 Fixed 9.50000 1 CD&R SMOKEY BUYER INC NaN CD&R Smokey Buyer Inc 12510CAA9 165000.00 PA 0.505585 Long DBT CORP US 2025-07-15 Fixed 6.75000 然后您可以使用最终的 df、添加或删除列等 您可以使用 MIT 许可的 datamule 包来完成此操作,该包可以处理下载和解析。免责声明:我是开发商。 from datamule import Filing, Downloader from pathlib import Path import os downloader = Downloader() downloader.download(form='NPORT-P',output_dir='NPORT',date=('2001-01-01','2024-11-01')) os.makedirs('NPORT_json', exist_ok=True) for file in Path('NPORT').iterdir(): filing = Filing(str(file), 'NPORT-P') filing.parse_filing() filing.write_json(f'NPORT_json/{file.name}.json') 您还可以直接访问馆藏数据,因为 Filing() 是一个可迭代对象。 pd.DataFrame(filing)
“pip install bs4”和“pip install BeautifulSoup4”有什么区别?
当我搜索BeautifulSoup lib的安装时,有时会看到pip install bs4,有时会看到pip install BeautifulSoup4。 这2种安装方式有什么区别?
使用 Python 和 BeautifulSoup 抓取同一个表的下一页
所以我正在学习网络抓取,并且正在使用雅虎财经网站进行练习,但是迭代我正在提取的表格的下一页很麻烦。 我尝试了下面的代码,但它只能工作...
我正在尝试编写一个代码来跟踪此网页上左手灰色框中的链接文本。在这种情况下,代码应该返回 瓦雷克里 酸宝宝 这是代码...
我正在构建一个脚本来抓取 cs2 比赛的 hltv.org/results 页面。但是,我遇到了很多问题,具体来说,网站 hltv.org/results?offset={} 有多个 d...
我正在尝试用Python构建一个scraper,但我无法定位多个div内的span元素。 该 URL 是 Google 搜索结果,因此我们以停车为例: https://www.go...
如何自动抓取网站中嵌入的 power bi 工具中存储的所有 PDF 文件?
因此,正如标题所说,我想自动抓取存储在嵌入网站的 power bi 工具中的所有 PDF 文件。网站如下:网站链接 要下载您需要的每个文件...
如何从 BeautifulSoup 循环中的嵌套标签中提取文本?
我正在尝试使用 Selenium 和 BeautifulSoup 从 https://yellowpages.com.eg/en/category/abrasives 中抓取元数据。我可以成功提取一些数据,但获取文本时遇到问题...
使用 Beautiful Soup / Python 将一个网站的 <body> 替换为另一个网站
我正在尝试用另一个标签及其内容替换标签和下面的所有内容。 **** 代码 **** 从 bs4 导入 BeautifulSoup as bs 导入操作系统 进口重新 # 删除...的最后一段
我确实有这个简单的页面,我使用selenium和BeautifulSoup。据我所知,该页面加载了 Javascript。有一个加载更多按钮,所以它会点击直到按钮不再出现
例如,这是一个帖子ID:https://www.instagram.com/p/C8_ohdOR/ 我想要图像源。 首先我使用selenium进行登录,然后抓取图像src。所以通过这个我得到了src。但这是...
我正在尝试为 Northvolt 公司 (https://northvolt.com/career) 提供特定职位列表时创建提醒。该职位的名称是“能源协调员”。在...
Beautifulsoup NoneType 对象没有属性“find_all”
按照本教程https://www.scrapingdog.com/blog/scrape-indeed-using-python/,并遇到此错误: 回溯(最近一次调用最后一次): 文件“C:/Users/det-lab/Documents/
在 Spyder IDE 中使用 Python BeautifulSoup 进行网页抓取
我正在尝试从 Spyder IDE 中的以下网址中抓取表格。到目前为止,以下是我的代码。 我检查了 hteml 代码以找出表类和任何 th、tr、td、标签。但提取
我不是来自网页设计或网站/html背景,并且是这个领域的新手。 尝试从此链接中抓取包含容器/卡片的元素。 我尝试过下面的代码并发现有点成功...
我需要站点地图中的提取链接 https://wunder.com.tr/sitemap.xml 我写了一些代码 导入请求 从 bs4 导入 BeautifulSoup wunder = requests.get("https://wunder.com.tr/sitemap.xml&...
使用 Selenium 或 Beautiful soup 刮擦 hulkapps 表
我有一个正在尝试抓取的网址:https://papemelroti.com/products/live-free-badge 但好像找不到这个表类 <... 我正在尝试抓取以下网址:https://papemelroti.com/products/live-free-badge 但是好像找不到这个表类 <table class="hulkapps-table table"><thead><tr><th style="border-top-left-radius: 0px;">Quantity</th><th style="border-top-right-radius: 0px;">Bulk Discount</th><th style="display: none">Add to Cart</th></tr></thead><tbody><tr><td style="border-bottom-left-radius: 0px;">Buy 50 + <span class="hulk-offer-text"></span></td><td style="border-bottom-right-radius: 0px;"><span class="hulkapps-price"><span class="money"><span class="money"> ₱1.00 </span></span> Off</span></td><td style="display: none;"><button type="button" class="AddToCart_0" style="cursor: pointer; font-weight: 600; letter-spacing: .08em; font-size: 11px; padding: 5px 15px; border-color: #171515; border-width: 2px; color: #ffffff; background: #161212;" onclick="add_to_cart(50)">Add to Cart</button></td></tr></tbody></table> 我已经有了我的 Selenium 代码,但它仍然没有抓取它。这是我的代码: from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time # Set up Chrome options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") service = Service('/usr/local/bin/chromedriver') # Adjust path if necessary driver = webdriver.Chrome(service=service, options=chrome_options) def get_page_html(url): driver.get(url) time.sleep(3) # Wait for JS to load return driver.page_source def scrape_discount_quantity(url): page_html = get_page_html(url) soup = BeautifulSoup(page_html, "html.parser") # Locate the table containing the quantity and discount table = soup.find('table', class_='hulkapps-table') print(page_html) if table: table_rows = table.find_all('tr') for row in table_rows: quantity_cells = row.find_all('td') if len(quantity_cells) >= 2: # Check if there are at least two cells quantity_cell = quantity_cells[0].get_text(strip=True) # Get quantity text discount_cell = quantity_cells[1].get_text(strip=True) # Get discount text return quantity_cell, discount_cell return None, None # Example usage url = 'https://papemelroti.com/products/live-free-badge' quantity, discount = scrape_discount_quantity(url) print(f"Quantity: {quantity}, Discount: {discount}") driver.quit() # Close the browser when done 它不断返回“无” 供参考: 折扣数据从此 https://volumediscount.hulkapps.com/api/v2/shop/get_offer_table API 端点加载,当您使用 selenium driver.page_source 返回页面源时,bs4 没有要抓取的表名称,我尝试了您的代码并确认 hulkapps-table 不存在于回应!所以很明显的反应是 None, 我的回答: 我使用了这个 https://volumediscount.hulkapps.com/api/v2/shop/get_offer_table API 端点以及此请求中的 product_id https://papemelroti.com/products/live-free-badge.json,这是我的代码,它是基本的: import requests import json def getDiscount(root_url): prod_resp = requests.get(f'{root_url}.json').content #Get product_id prod_id = json.loads(prod_resp)['product']['id'] disc_url = 'https://volumediscount.hulkapps.com/api/v2/shop/get_offer_table' #Discount URL data = f'pid={prod_id}&store_id=papemelroti.myshopify.com' headers = { "User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0", "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8" } resp = requests.post(disc_url, data=data, headers=headers).content data_json = json.loads(resp) disc_json = json.loads(data_json['eligible_offer']['offer_levels'])[0] #Offer has two variants: 'Price' and 'Off' so you can use condition if you like to scrape products other than 'live-free-badge' if 'price_discount' in disc_json[2]: print(f"Product ID:{prod_id} (Quantity: {disc_json[0]}, Discount: {disc_json[1]} Price discount)") elif 'Off' in disc_json[2]: print(f"Product ID:{prod_id} (Quantity: {disc_json[0]}, Discount: {disc_json[1]}% Off)") #sample for both 'Off' and 'Price' getDiscount('https://papemelroti.com/products/dear-me-magnet') getDiscount('https://papemelroti.com/products/live-free-badge') 输出: Product ID:7217967726790 (Quantity: 50, Discount: 10% Off) Product ID:104213217289 (Quantity: 50, Discount: 1.00 Price discount) 让我知道这是否可以或者您是否想严格使用硒
html如下: 我不想要这个 我正在尝试获取所有 div 并投射...
使用 Python 3.9,如何从 URL -> https://www.tamoil.ch/en/store-locator 获取 MS Excel 中的所有物理地址
我想从这个url [https://www.tamoil.ch/en/store-locator]获取MS-excel中的所有物理地址。 电子表格只有标题,但没有代码的输出。 导入请求 来自...