嘗試構建一個遍歷網路鏈接的迭代,以提取 p 標簽中的整數,該整數位于 p 標簽之后,該 p 標簽包含“AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON”字樣。目標頁面具有足夠接近的圖案但不相同。該 AGGREGATE AMOUNT 句子的格式不同(有時大寫,有時不大寫,間距可能不相同)。我在下面嘗試從中提取整數值的部分包含了 3 個示例。
以下是我試圖實作的步驟:
1-通過鏈接迭代一些鏈接:https : //www.sec.gov/Archives//edgar/data/29669/000119312521353247/d228949dsc13da.htm https://www.sec.gov/Archives//edgar/data/1482018 /000119312521353071/d258656dsc13d.htm https://www.sec.gov/Archives//edgar/data/1590854/000119312521353064/d210475dsc13d.htm https://www.sec.gov/Archives//edgar/data/1021944/000119312521353050 /d243715dsc13g.htm https://www.sec.gov/Archives//edgar/data/1609492/000119312521353003/d251372dsc13da.htm ...
2-查找包含部分單詞“AGGREGATE AMOUNT BENEFICIALLY”的 p 標簽,可以是 small caps 、 titled 或全部大寫
<p style="margin-top:0pt; margin-bottom:0pt; font-size:10pt; font-family:Times New Roman"> Aggregate Amount Beneficially Owned by Each Reporting Person:</p>
3-一旦找到 p 標簽,繼續查看后面的 p 標簽,直到我們找到第一個 p 標簽,其中字串(如果存在),去掉逗號后是一個整數(非空)。這可以是直接的 p后面的標記,或后面的標記,如下面的代碼所示。
<p style="font-size:12pt; margin-top:0pt; margin-bottom:0pt"> </p><p style="margin-top:0pt; margin-bottom:1pt; font-size:10pt; font-family:Times New Roman"> 10,927,100*</p>
10,927,100 是我需要的數字,雖然它需要從逗號中去除(我知道我們可以使用下面的代碼),但是字串也需要從不是數字的任何其他字符中去除......
int(shares.replace(',', '')
示例1:
<table border="0" cellpadding="0" cellspacing="0" style="BORDER-COLLAPSE:COLLAPSE; font-family:Times New Roman; font-size:10pt" width="98%">
<tr>
<td width="3%"></td>
<td valign="bottom" width="1%"></td>
<td width="6%"></td>
<td valign="bottom" width="1%"></td>
<td></td>
<td valign="bottom" width="1%"></td>
<td width="88%"></td></tr>
<tr style="page-break-inside:avoid ; font-family:Times New Roman; font-size:10pt">
<td style="BORDER-LEFT:1px solid #000000; BORDER-TOP:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-left:8pt" valign="top">11. </td>
<td style=" BORDER-LEFT:1px solid #000000; BORDER-TOP:1px solid #000000; BORDER-BOTTOM:1px solid #000000" valign="bottom"> </td>
<td colspan="5" style="BORDER-TOP:1px solid #000000; BORDER-RIGHT:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-right:2pt" valign="top">
<p style="margin-top:0pt; margin-bottom:0pt; font-size:10pt; font-family:Times New Roman"> Aggregate Amount Beneficially Owned by Each Reporting Person:</p> <p style="font-size:12pt; margin-top:0pt; margin-bottom:0pt"> </p>
<p style="margin-top:0pt; margin-bottom:1pt; font-size:10pt; font-family:Times New Roman"> 10,927,100*</p></td></tr>
<tr style="page-break-inside:avoid ; font-family:Times New Roman; font-size:10pt">
<td style="BORDER-LEFT:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-left:8pt" valign="top">12.</td>
<td style=" BORDER-LEFT:1px solid #000000; BORDER-BOTTOM:1px solid #000000" valign="bottom"> </td>
<td colspan="5" style="BORDER-RIGHT:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-right:2pt" valign="top"> <p style="margin-top:0pt; margin-bottom:0pt; font-size:10pt; font-family:Times New Roman"> Check if the Aggregate
Amount in Row (11) Excludes Certain Shares (See Instructions):</p> <p style="font-size:12pt;margin-top:0pt;margin-bottom:0pt"> </p>
例子2:
<p style="font-size:12pt; margin-top:0pt; margin-bottom:0pt"> </p> <p style="margin-top:0pt; margin-bottom:1pt; font-size:12pt; font-family:Times New Roman">28,911,268(1)</p></td></tr>
<tr style="page-break-inside:avoid ; font-family:Times New Roman; font-size:12pt">
<td style="BORDER-LEFT:1px solid #000000; BORDER-TOP:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-left:8pt" valign="top"><font style="font-size:10pt">11</font></td>
<td style=" BORDER-LEFT:1px solid #000000; BORDER-TOP:1px solid #000000; BORDER-BOTTOM:1px solid #000000" valign="bottom"> </td>
<td colspan="5" style="BORDER-TOP:1px solid #000000; BORDER-RIGHT:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-right:2pt" valign="top">
<p style="margin-top:0pt; margin-bottom:0pt; font-size:10pt; font-family:Times New Roman">AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON</p> <p style="font-size:12pt; margin-top:0pt; margin-bottom:0pt"> </p>
<p style="margin-top:0pt; margin-bottom:1pt; font-size:12pt; font-family:Times New Roman">28,911,268</p></td></tr>
<tr style="page-break-inside:avoid ; font-family:Times New Roman; font-size:12pt">
例子3:
<table border="0" cellpadding="0" cellspacing="0" style="BORDER-COLLAPSE:COLLAPSE; font-family:Times New Roman; font-size:10pt" width="100%">
<tr>
<td width="3%"></td>
<td valign="bottom" width="1%"></td>
<td width="6%"></td>
<td valign="bottom" width="1%"></td>
<td></td>
<td valign="bottom" width="1%"></td>
<td width="88%"></td></tr>
<tr style="page-break-inside:avoid ; font-family:Times New Roman; font-size:10pt">
<td style="BORDER-LEFT:1px solid #000000; BORDER-TOP:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-left:8pt" valign="top">11 </td>
<td style=" BORDER-LEFT:1px solid #000000; BORDER-TOP:1px solid #000000; BORDER-BOTTOM:1px solid #000000" valign="bottom"> </td>
<td colspan="5" style="BORDER-TOP:1px solid #000000; BORDER-RIGHT:1px solid #000000; BORDER-BOTTOM:1px solid #000000; padding-right:2pt" valign="top">
<p style="margin-top:0pt; margin-bottom:0pt; font-size:10pt; font-family:Times New Roman"> AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON</p> <p style="font-size:12pt; margin-top:0pt; margin-bottom:0pt"> </p><p style="margin-top:0pt; margin-bottom:1pt; font-size:10pt; font-family:Times New Roman"> 23,866,091</p></td></tr><tr style="page-break-inside:avoid ; font-family:Times New Roman; font-size:10pt">
目前,我正在嘗試收集句子“AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON”的所有可能的字串形式,而不是搜索可以適用于所有人的部分字串。
到目前為止我當前的代碼:
def doGet(url):
s = requests.Session()
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Sec-CH-UA': 'Examplary Browser',
'Sec-CH-UA-Mobile': '?0',
'Sec-CH-UA-Platform': "Windows",
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"authority": "www.sec.gov",
"method": "GET",
"path": "/Archives/edgar/data/59478/000120919121046268/0001209191-21-046268-index.htm",
"scheme": "https",
"accept": "text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9",
"accept-encoding": "gzip deflate br",
"accept-language": "en-US,en;q=0.9,ar-LB;q=0.8,ar;q=0.7",
"cache-control": "max-age=0"}
r = None
proxies = {
'http': 'socks5://127.0.0.1:9050',
'https': 'socks5://127.0.0.1:9050'
}
try:
r = s.get(url, headers=headers)
if r.status_code == 403:
i = 1
while r.status_code == 403 and i <= 10:
print("Status code: " str(r.status_code) " for : " url)
time.sleep(1)
r = s.get(url, headers=headers, proxies = proxies)
i = 1
# print("Status code: " str(r.status_code) " for : " url)
# r.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("Http Error: " errh " for url: " url)
if r.get_status_code == 403:
i = 1
while r.status_code == 403 and i <= 10:
time.sleep(i)
r = s.get(url, headers=headers)
i = 1
except requests.exceptions.ConnectionError as errc:
print("Error Connecting: " str(errc) " for : " url)
except requests.exceptions.Timeout as errt:
print("Timeout Error: " str(errt) " for : " url)
except requests.exceptions.RequestException as err:
print("OOps: Something Else" str(err) " for : " url)
return r
for link in link_list:
res = doGet(link)
soup = BeautifulSoup(res.text, 'html.parser')
# Finding a pattern(certain text)
try:
pattern = '9. AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON'
# Anchor tag
text1 = soup.find('p', text = pattern)
# print(text1)
shares = text1.find_next_sibling('p').string
shares
except Exception as e:
print('test1' str(e))
pass
try:
pattern = " AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON"
# Anchor tag
text1 = soup.find('p', text = pattern)
# print(text1)
shares =text1.find_next_sibling('p').find_next_sibling('p').string
print(shares)
except Exception as e:
print('test2' str(e))
pass
try:
pattern = "AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON"
# Anchor tag
text1 = soup.find('p', text = pattern)
# print(text1)
shares =text1.find_next_sibling('p').find_next_sibling('p').string
print(shares)
except Exception as e:
print('test3' str(e))
pass
try:
pattern = " Aggregate Amount Beneficially Owned by Each Reporting Person:"
# Anchor tag
text1 = soup.find('p', text = pattern)
# print(text1)
shares =text1.find_next_sibling('p').find_next_sibling('p').string
print(shares)
except Exception as e:
print('test4' str(e))
pass
try:
pattern = '9. AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON'
# Anchor tag
text1 = soup.find('p', text = pattern)
# print(text1)
shares = text1.find_next_sibling('p').string
shares
except Exception as e:
print('test1' str(e))
pass
uj5u.com熱心網友回復:
你應該能夠適應這一點。您正在訪問的頁面是非常簡單的 HTML(沒有 Javascript),因此只需在一個簡單的回圈中處理頁面就非常簡單和高效。
這里發生的事情是我們以不區分大小寫的方式查找文本匹配“AGGREGATE AMOUNT BENEFICIALLY OWNED BY EACH REPORTING PERSON”的p標簽。如果我們發現,我們設定一個標志。然后在BeautifulSoup 找到的p標簽的后續迭代中,我們查找 a) 非空且 b) 包含數字序列(忽略逗號)的文本。
等等...
import requests
from bs4 import BeautifulSoup as BS
import re
URLS = ['https://www.sec.gov/Archives//edgar/data/29669/000119312521353247/d228949dsc13da.htm',
'https://www.sec.gov/Archives//edgar/data/1482018/000119312521353071/d258656dsc13d.htm',
'https://www.sec.gov/Archives//edgar/data/1590854/000119312521353064/d210475dsc13d.htm',
'https://www.sec.gov/Archives//edgar/data/1021944/000119312521353050/d243715dsc13g.htm',
'https://www.sec.gov/Archives//edgar/data/1609492/000119312521353003/d251372dsc13da.htm']
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
"Accept-Language": "en-US,en;q=0.5"
}
AGG = 'AGGREGATE AMOUNT BENEFICIALLY'
with requests.Session() as session:
for url in URLS:
try:
(r := session.get(url, headers=HEADERS)).raise_for_status()
print(url)
soup = BS(r.text, 'lxml')
np = False
for p in soup.find_all('p'):
if np:
if (t := p.text.strip()):
if (m := re.search(r'(\d )', t.replace(',', ''))):
print(f'\t{m[1]}')
np = False
else:
if AGG in p.text.upper():
np = True
except Exception as e:
print(f'Error while processing {url} -> {e}')
uj5u.com熱心網友回復:
帶有 css 選擇器的版本,我也會讓您處理格式。如果遇到不同的大小寫,則必須更新選擇器,但語法非常簡單
import requests
from bs4 import BeautifulSoup
links=[
'https://www.sec.gov/Archives//edgar/data/29669/000119312521353247/d228949dsc13da.htm',
'https://www.sec.gov/Archives//edgar/data/1482018/000119312521353071/d258656dsc13d.htm',
'https://www.sec.gov/Archives//edgar/data/1590854/000119312521353064/d210475dsc13d.htm',
'https://www.sec.gov/Archives//edgar/data/1021944/000119312521353050/d243715dsc13g.htm',
'https://www.sec.gov/Archives//edgar/data/1609492/000119312521353003/d251372dsc13da.htm']
ua={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_6 like Mac OS X) AppleWebKit/535.2 (KHTML, like Gecko) FxiOS/9.5o4548.0 Mobile/38G031 Safari/535.2"}
with requests.session() as s:
s.headers.update(ua)
for link in links:
r=s.get(link)
print(r.status_code, r.reason, link)
soup=BeautifulSoup(r.text, 'lxml')
ps=soup.select('''td[colspan="5"]:has(p:-soup-contains(
"Aggregate Amount Beneficially",
"AGGREGATE AMOUNT BENEFICIALLY"
)) p:last-of-type''')
for p in ps:
print(p.text)
uj5u.com熱心網友回復:
關閉diggusbickus approache這個答案將采用css selectors與requests和BeautifulSoup唯一,所以你不需要進口re library
它通過pattern使用 python搜索while 來跟蹤該程序,f-string我們也可以使用它.upper()來修改pattern. 我的選擇集中在<p>包含pattern及其最后一個兄弟的<p>
soup.select(f'''p:-soup-contains("{pattern}","{pattern.upper()}") ~ p:last-of-type''')
要僅提取數字并獲得一個int()我使用的.filter()方法:
int("".join(filter(str.isdigit, p.text.split("(")[0])))
注意 為了處理 () 中的數字,我們必須在過濾之前拆分字串
例子
import requests
from bs4 import BeautifulSoup
links=[
'https://www.sec.gov/Archives//edgar/data/29669/000119312521353247/d228949dsc13da.htm',
'https://www.sec.gov/Archives//edgar/data/1482018/000119312521353071/d258656dsc13d.htm',
'https://www.sec.gov/Archives//edgar/data/1590854/000119312521353064/d210475dsc13d.htm',
'https://www.sec.gov/Archives//edgar/data/1021944/000119312521353050/d243715dsc13g.htm',
'https://www.sec.gov/Archives//edgar/data/1609492/000119312521353003/d251372dsc13da.htm'
]
headers={"User-Agent": "Mozilla/5.0"}
pattern = 'Aggregate Amount Beneficially'
for link in links:
r=requests.get(link,headers=headers)
soup=BeautifulSoup(r.text, 'lxml')
for p in soup.select(f'''p:-soup-contains("{pattern}","{pattern.upper()}") ~ p:last-of-type'''):
text = p.text.strip().split("(")[0]
if any(char.isdigit() for char in text):
print(f'{link}\n{p.text}\n{int("".join(filter(str.isdigit, text)))}')
輸出
輸出應顯示從stringto的轉換int- url 僅用于控制結果:...
https://www.sec.gov/Archives//edgar/data/1609492/000119312521353003/d251372dsc13da.htm
1,100,037(2)
1100037
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/382742.html
上一篇:從網址未更改的站點中抓取回應表
下一篇:從容器中抓取資料
