Python Web Scraping: как получить 'href' в соответствии с содержимым в последнем теге - PullRequest
0 голосов
/ 29 января 2020
<td valign="top" align="left"><a href="/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025-index.htm">GM Financial Automobile Leasing Trust 2017-1</a></td>
<td valign="top" align="left"><a href="/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025.txt">[text]</a> <a href="/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025-index.htm">[html]</a></td>

В этом примере я хочу получить ссылку '/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025.txt' из второго тега, используя строку 'GM Financial Automobile Leasing Trust 2017-1' в первом теге. Есть ли способ в Python, что я могу это сделать?

Вот оригинальная веб-страница SE C EDGAR

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Как насчет этого?

from simplified_scrapy.simplified_doc import SimplifiedDoc
html ='''
<td valign="top" align="left"><a href="/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025-index.htm">GM Financial Automobile Leasing Trust 2017-1</a></td>
<td valign="top" align="left"><a href="/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025.txt">[text]</a> <a href="/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025-index.htm">[html]</a></td>
'''
doc = SimplifiedDoc(html)
td = doc.getElementByText('GM Financial Automobile Leasing Trust 2017-1',tag='td')
a = td.next.a
print (a.href)

Результат:

/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025.txt
0 голосов
/ 29 января 2020

Отредактированный ответом @ dabingsou и этой записью , я вспомнил, что Beautifulsoup имеет эту функцию find_next , и пришел с этим очень эффективным ответом. 1007 *

from bs4 import BeautifulSoup
import urllib.request, urllib.error
import re

sauce = urllib.request.urlopen ("https://www.sec.gov/cgi-bin/srch-edgar?text=GM%20%20abs-ee&start=1&count=80&first=2016&last=2020").read ()
soup = BeautifulSoup (sauce, 'lxml')

text = 'GM Financial Automobile Leasing Trust 2017-1'
pool = soup.findAll('a', string = text)
links = []
for i in pool:
    link = i.find_next('a', attrs={'href': re.compile ("txt$")})
    links.append(link.get('href'))

print(links)

И результат будет такой, как

['/Archives/edgar/data/1696969/000169696919000036/0001696969-19-000036.txt', '/Archives/edgar/data/1696969/000169696919000033/0001696969-19-000033.txt', '/Archives/edgar/data/1696969/000169696919000029/0001696969-19-000029.txt', '/Archives/edgar/data/1696969/000169696919000025/0001696969-19-000025.txt', '/Archives/edgar/data/1696969/000169696919000022/0001696969-19-000022.txt', '/Archives/edgar/data/1696969/000169696919000019/0001696969-19-000019.txt', '/Archives/edgar/data/1696969/000169696919000015/0001696969-19-000015.txt', '/Archives/edgar/data/1696969/000169696919000012/0001696969-19-000012.txt', '/Archives/edgar/data/1696969/000169696919000009/0001696969-19-000009.txt', '/Archives/edgar/data/1696969/000169696919000006/0001696969-19-000006.txt', '/Archives/edgar/data/1696969/000169696919000003/0001696969-19-000003.txt', '/Archives/edgar/data/1696969/000169696918000039/0001696969-18-000039.txt', '/Archives/edgar/data/1696969/000169696918000036/0001696969-18-000036.txt', '/Archives/edgar/data/1696969/000169696918000033/0001696969-18-000033.txt', '/Archives/edgar/data/1696969/000169696918000030/0001696969-18-000030.txt', '/Archives/edgar/data/1696969/000169696918000027/0001696969-18-000027.txt', '/Archives/edgar/data/1696969/000169696918000024/0001696969-18-000024.txt', '/Archives/edgar/data/1696969/000169696918000020/0001696969-18-000020.txt', '/Archives/edgar/data/1696969/000169696918000016/0001696969-18-000016.txt', '/Archives/edgar/data/1696969/000169696918000013/0001696969-18-000013.txt', '/Archives/edgar/data/1696969/000169696918000010/0001696969-18-000010.txt', '/Archives/edgar/data/1696969/000169696918000007/0001696969-18-000007.txt', '/Archives/edgar/data/1696969/000169696918000003/0001696969-18-000003.txt', '/Archives/edgar/data/1696969/000169696917000036/0001696969-17-000036.txt', '/Archives/edgar/data/1696969/000169696917000033/0001696969-17-000033.txt', '/Archives/edgar/data/1696969/000169696917000030/0001696969-17-000030.txt', '/Archives/edgar/data/1696969/000169696917000027/0001696969-17-000027.txt', '/Archives/edgar/data/1696969/000169696917000023/0001696969-17-000023.txt', '/Archives/edgar/data/1696969/000169696917000019/0001696969-17-000019.txt', '/Archives/edgar/data/1696969/000169696917000016/0001696969-17-000016.txt', '/Archives/edgar/data/1696969/000169696917000013/0001696969-17-000013.txt', '/Archives/edgar/data/1696969/000169696917000008/0001696969-17-000008.txt', '/Archives/edgar/data/1696969/000169696917000009/0001696969-17-000009.txt', '/Archives/edgar/data/1696969/000163105517000006/0001631055-17-000006.txt']

, это именно то, что мне нужно.

0 голосов
/ 29 января 2020

Поскольку данные, которые я хочу, лежат в таблице, мне удалось сначала проанализировать таблицу, затем извлечь все ссылки, оканчивающиеся на «.txt», а затем объединить ссылки с таблицей. Наконец, я могу использовать индексирование таблиц, чтобы найти нужные ссылки. Код следующий.

from bs4 import BeautifulSoup
import urllib.request, urllib.error
import re
import pandas as pd

sauce = urllib.request.urlopen ("https://www.sec.gov/cgi-bin/srch-edgar?text=GM%20%20abs-ee&start=1&count=80&first=2016&last=2020").read ()
soup = BeautifulSoup (sauce, 'lxml')

tables = soup.find_all('table')
table = tables[4]
table_rows = table.find_all('tr')
links = []
for link in table.findAll ('a', attrs={'href': re.compile ("txt$")}):
    links.append (link.get ('href'))

tb = []
for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    tb.append(row)
tb.pop(0)
tb = pd.DataFrame(tb)
tb.columns = ['No.', 'Company', 'Format', 'Form Type', 'Filling Date', 'Size']
tb['Links'] = links
print(tb)

Результат выглядит следующим образом

   No.                                       Company         Format Form Type Filling Date       Size                                              Links
0   837                              AFS SENSUB CORP.  [text] [html]    ABS-EE   12/30/2019  198106358  /Archives/edgar/data/1347185/00013471851900003...
1   837                              AFS SENSUB CORP.  [text] [html]    ABS-EE   10/01/2019  150094752  /Archives/edgar/data/1347185/00013471851900003...
2   837                              AFS SENSUB CORP.  [text] [html]    ABS-EE   07/08/2019  154441899  /Archives/edgar/data/1347185/00013471851900002...
3   837                              AFS SENSUB CORP.  [text] [html]    ABS-EE   04/02/2019  190047962  /Archives/edgar/data/1347185/00013471851900001...
4   837                              AFS SenSub Corp.  [text] [html]    ABS-EE   12/31/2018  185798565  /Archives/edgar/data/1347185/00013471851800004...
..  ...                                           ...            ...       ...          ...        ...                                                ...
76  886  GM Financial Automobile Leasing Trust 2017-3  [text] [html]    ABS-EE   01/23/2020   57006641  /Archives/edgar/data/1712799/00017127992000000...
77  886  GM Financial Automobile Leasing Trust 2017-3  [text] [html]    ABS-EE   12/23/2019   63413352  /Archives/edgar/data/1712799/00017127991900003...
78  886  GM Financial Automobile Leasing Trust 2017-3  [text] [html]    ABS-EE   11/25/2019   72044066  /Archives/edgar/data/1712799/00017127991900003...
79  886  GM Financial Automobile Leasing Trust 2017-3  [text] [html]    ABS-EE   10/25/2019   79372142  /Archives/edgar/data/1712799/00017127991900003...
80  886  GM Financial Automobile Leasing Trust 2017-3  [text] [html]    ABS-EE   09/25/2019   85884576  /Archives/edgar/data/1712799/00017127991900003...


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...