Как распечатать только определенный текст, используя BeautifulSoup - PullRequest
0 голосов
/ 02 ноября 2011

Я пытаюсь получить некоторые финансовые данные для городских властей, используя BeautifulSoup (пришлось конвертировать файлы из PDF). Я просто хочу получить данные в виде CSV-файла, а затем проанализирую их в Excel или SAS. Моя проблема в том, что я не хочу печатать "& nbsp;" это в оригинальном HTML, только цифры и заголовок строки. Любые предложения о том, как я могу сделать это без использования регулярных выражений?

Ниже приведен пример HTML, который я смотрю. Далее идет мой код (в настоящее время просто в режиме проверки концепции, нужно доказать, что я могу получить чистые данные, прежде чем двигаться дальше) Новичок в Python и программировании, поэтому любая помощь приветствуется.

<TD class="td1629">Investments (Note 2)</TD>

<TD class="td1605">&nbsp;</TD>

<TD class="td479">&nbsp;</TD>

<TD class="td1639">-</TD>

<TD class="td386">&nbsp;</TD>

<TD class="td116">&nbsp;</TD>

<TD class="td1634">2,207,592</TD>

<TD class="td479">&nbsp;</TD>

<TD class="td1605">&nbsp;</TD>

<TD class="td1580">2,207,592</TD>

<TD class="td301">&nbsp;</TD>

<TD class="td388">&nbsp;</TD>

<TD class="td1637">2,882,018</TD>

код

import htmllib
import urllib
import urllib2
import re
from BeautifulSoup import BeautifulSoup

CAFR = open("C:/Users/snown/Documents/CAFR2004 BFS Statement of Net Assets.html", "r")

soup = BeautifulSoup(CAFR)

assets_table = soup.find(True, id="page_27").find(True, id="id_1").find('table') 

rows = assets_table.findAll('tr')    
for tr in rows:    
  cols = tr.findAll('td')    
  for td in cols:    
    text = ''.join(td.find(text=True))
    print text+"|",    
  print

1 Ответ

2 голосов
/ 02 ноября 2011
soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)

Преобразует &nbsp; и другие html-сущности в соответствующие символы.

Чтобы записать его в файл CSV:

>>> import csv
>>> import sys
>>> csv_file = sys.stdout
>>> writer = csv.writer(csv_file, delimiter="|")
>>> soup = BeautifulSoup("<tr><td>1<td>&nbsp;<td>3",
...                      convertEntities=BeautifulSoup.HTML_ENTITIES)
>>> writer.writerows([''.join(t.encode('utf-8') for t in td(text=True))
...                   for td in tr('td')] for tr in soup('tr'))
1| |3

Я использовал t.encode('utf-8') из-за&nbsp; переводится в не-ascii U+00A0 (пробел без пробелов).

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