Извлекайте текст в правильном формате (с пробелами между ними) из тегов <td>, используя красивый суп - PullRequest
2 голосов
/ 02 июля 2019

Я пытаюсь извлечь заголовки столбцов из одной из таблиц из ABBV 10-k сек подачи (` Эмитент Покупки ценных бумаг 'на стр. 25 - ниже графика .)

внутри тега <td> в заголовке столбца <tr> тег, текст в отдельных тегах <div>, как в примере ниже

<tr>
  <td>
    <div>string1</div>
    <div>string2</div>
    <div>string3</div>
  </td>
</tr>

при попытке извлечь весь текст из тега разделение пробелов между текстами отсутствует (например, для приведенного выше html-вывода будет string1string3string3 ожидаемый string1 string3 string3).

Использование приведенного ниже кода для извлечения заголовков столбцов из таблицы

url = 'https://www.sec.gov/Archives/edgar/data/1551152/000155115218000014/abbv-20171231x10k.htm'
htmlpage = requests.get(url)
soup = BeautifulSoup(htmlpage.text, "lxml")
table = soup.find_all('table')[76]
rows = table.find_all('tr')
table_data = []
for tr in rows[2:3]:
    row_data=[]
    cells = tr.find_all(['td', 'th'], recursive=False)
    for cell in cells[1:4]:
        row_data.append(cell.text.encode('utf-8'))
    table_data.append([x.decode('utf-8').strip() for x in row_data])

print(table_data)

Вывод: [['(a) TotalNumberof Shares(or Units)Purchased', '', '(b) AveragePricePaid per Share(or Unit)']]

Ожидаемый результат: [['(a) Total Number of Shares (or Units) Purchased', '', '(b) Average Price Paid per Share (or Unit)']] (каждое слово разделено пробелом)

1 Ответ

2 голосов
/ 02 июля 2019

используйте параметр separator с .get_text():

html = '''<tr>
  <td>
    <div>string1</div>
    <div>string2</div>
    <div>string3</div>
  </td>
</tr>'''

import bs4

soup = bs4.BeautifulSoup(html, 'html.parser')

td = soup.find('td')
td.get_text(separator=' ')

Вот как это выглядит с вашим кодом:

from bs4 import BeautifulSoup
import requests

url = 'https://www.sec.gov/Archives/edgar/data/1551152/000155115218000014/abbv-20171231x10k.htm'
htmlpage = requests.get(url)
soup = BeautifulSoup(htmlpage.text, "lxml")
table = soup.find_all('table')[76]
rows = table.find_all('tr')
table_data = []
for tr in rows[2:3]:
    row_data=[]
    cells = tr.find_all(['td', 'th'], recursive=False)
    for cell in cells[1:4]:
        row_data.append(cell.get_text(separator=' ').encode('utf-8'))
    table_data.append([x.decode('utf-8').strip() for x in row_data])

print(table_data)

Выход:

print(table_data)
[['(a) Total Number of Shares (or Units) Purchased', '', '(b) Average Price Paid per Share (or Unit)']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...