BeautifulSoup или регулярное выражение HTML-таблицы в структуру данных? - PullRequest
0 голосов
/ 16 сентября 2010

У меня есть таблица HTML, из которой я пытаюсь проанализировать информацию. Однако некоторые таблицы занимают несколько строк / столбцов, поэтому я хотел бы использовать что-то вроде BeautifulSoup для разбора таблицы на структуру Python некоторого типа. Я думаю просто использовать список списков, чтобы я мог превратить что-то вроде

<tr>
  <td>1,1</td>
  <td>1,2</td>
</tr>
<tr>
  <td>2,1</td>
  <td>2,2</td>
</tr>

в

[['1,1', '1,2'],
 ['2,1', '2,2']]

Что я (думаю) должно быть довольно простым. Тем не менее, есть некоторые небольшие осложнения, потому что некоторые клетки занимают несколько строк / столбцов. Плюс есть много совершенно ненужной информации:

    <td ondblclick="DoAdd('/student_center/sc_all_rooms/d05/09/2010/editformnew?display=W&amp;style=L&amp;positioning=A&amp;adddirect=yes&amp;accessid=CreateNewEdit&amp;filterblock=N&amp;popeditform=yes&amp;returncalendar=student_center/sc_all_rooms')"
     class="listdefaultmonthbg" 
     style="cursor:crosshair;" 
     width="5%" 
     nowrap="1" 
     rowspan="1">
       <a class="listdatelink" 
          href="/student_center/sc_all_rooms/d05/09/2010/edit?style=L&amp;display=W&amp;positioning=A&amp;filterblock=N&amp;adddirect=yes&amp;accessid=CreateNewEdit">Sep 5</a>
    </td>

А на самом деле код выглядит еще хуже. Все, что мне действительно нужно, это:

<td rowspan="1">Sep 5</td>

Двумя строками позже есть строка с 17-ю интервалами строк. Для многострочных интервалов я думал примерно так:

<tr>
  <td rowspan="2">Sep 5</td>
  <td>Some event</td>
</tr>
<tr>
  <td>Some other event</td>
</tr>

закончится так:

[["Sep 5", "Some event"],
 [None, "Some other event"]]

На странице несколько таблиц, и я уже могу найти ту, которая мне нужна, я просто не знаю, как разобрать нужную мне информацию. Я знаю, что могу использовать BeautfulSoup для «RenderContents», но в некоторых случаях есть теги ссылок, от которых мне нужно избавиться (при сохранении текста).

Я думал о процессе, похожем на этот:

  1. Найти таблицу
  2. Количество строк в таблицах (len(table.findAll('tr'))?)
  3. Создать список
  4. Анализ таблицы в списке (синтаксис BeautifulSoup ???)
  5. Прибыль! (Ну, это чисто внутренняя программа, так что не совсем ...)

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010

В последнее время в группе python на linkedin обсуждалась похожая проблема, и, очевидно, lxml - это наиболее рекомендуемый синтаксический анализатор для страниц HTML.

http://www.linkedin.com/groupItem?view=&gid=25827&type=member&item=27735259&qid=d2948a0e-6c0c-4256-851b-5e7007859553&goback=.gmp_25827

0 голосов
/ 16 сентября 2010

Вам, вероятно, понадобится идентифицировать таблицу с некоторыми атрибутами, идентификатором или именем.

from BeautifulSoup import BeautifulSoup

data = """
<table>
<tr>
  <td>1,1</td>
  <td>1,2</td>
</tr>
<tr>
  <td>2,1</td>
  <td>2,2</td>
</tr>
</table>
"""

soup = BeautifulSoup(data)

for t in soup.findAll('table'):
    for tr in t.findAll('tr'):
        print [td.contents for td in tr.findAll('td')]

Редактировать: Что должна делать программа, если имеется несколько ссылок?

Ex:

<td><a href="#">A</a> B <a href="#">C</a></td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...