Python BeautifulSoup Автоматическое отслеживание строк и столбцов таблицы содержимого - PullRequest
0 голосов
/ 05 апреля 2011

Сначала позвольте мне сказать, что я новичок в стеке и в Python.Я только начал работать с ним на прошлой неделе.Я, однако, опытный программист PHP / C ++ / Pascal / ADA / B / Forth (показывая мой возраст).

Я написал скрипт, который извлекает страницы продукта с веб-сайта и сохраняет их в моей локальной базе данных MySQL.Я сделал это, чтобы сканировать сайт поздно ночью, когда нагрузка мала.Теперь мне нужно разобраться в html каждой страницы и получить описания продуктов.Они размещены в таблицах.Однако каждая страница может иметь необходимые значения в разных строках / столбцах.

В чем я могу быть уверен:

  • Каждая таблица имеет заголовок, который определяетданные в строках / столбцах под ним.
  • Текст заголовка согласован для каждого значения, т. е. «Часть» всегда описывает тип детали и «Номер детали».всегда описывает номер детали.
  • Не все страницы будут содержать все необходимые данные.Поэтому, если он не найден, он должен сохранить найденное.

В следующем разделе это вторая часть, получение значений данных, с которыми у меня возникли проблемы.Как выбрать n-й столбец из строки?

Мой текущий подход:

Чтобы получить желаемые столбцы

  • Получить HTML-документ из БД
  • Захватить таблицу (моя таблица всегда содержится в единственном элементе div на странице.
  • Захватить все строки (в действительности нужно сделать это только для первой строки)
  • Для каждой строки возьмите индекс строки и столбца ', когда я найду нужные имена полей.

Чтобы получить значения данных

  • Для каждой строки:
  • Пропустите строку, если это был заголовок (сохраните количество строк для полей с заголовками)
  • для каждого столбца, захватите текстовое значение.
  • Сохраните значения в db

Важная часть моей страницы выглядит так:

<div>
   ... 
   <table>
      <tr><td>&nbsp;</td><td><b>Item</b></td><td>&nbsp;</td><td><b>Description</b></td><td>&nbsp;</td><td><b>Part No.</b></td><td>&nbsp;</td><td><b>Color</b></td><td>&nbsp;</td></tr>
      <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
      <tr><td>&nbsp;</td><td>Toaster</td><td>&nbsp;</td><td>2-Slice</td><td>&nbsp;</td><td>#25713</td><td>&nbsp;</td><td>Chorme</td><td>&nbsp;</td></tr>
   </table>
   ...
</div>

Большое спасибо всем, кто откликнулся.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Вот как вы делаете это с HTQL:

import htql;
doc = '''<div>     <table>
    <tr><td>&nbsp;</td><td><b>Item</b></td><td>&nbsp;</td><td><b>Description</b></td><td>&nbsp;        </td><td><b>Part No.</b></td><td>&nbsp;</td><td><b>Color</b></td><td>&nbsp;</td></tr>
    <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
    <tr><td>&nbsp;</td><td>Toaster</td><td>&nbsp;</td><td>2-Slice</td><td>&nbsp;</td><td>#25713</td><td>&nbsp;</td><td>Chorme</td><td>&nbsp;</td></tr>
  </table>  </div>''';

query = "<div>.<table>.<tr>{item=<td (th='Item')>&tx; desc=<td (th='Description')>&tx | item<>'Item'}";

for item, desc in htql.HTQL(doc, query): 
    print(item, desc); 
0 голосов
/ 05 апреля 2011

Вот как я справлюсь с этим:

from BeautifulSoup import BeautifulSoup

doc = '''<div>
   <table>
      <tr><td>&nbsp;</td><td><b>Item</b></td><td>&nbsp;</td><td><b>Description</b></td><td>&nbsp;</td><td><b>Part No.</b></td><td>&nbsp;</td><td><b>Color</b></td><td>&nbsp;</td></tr>
      <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
      <tr><td>&nbsp;</td><td>Toaster</td><td>&nbsp;</td><td>2-Slice</td><td>&nbsp;</td><td>#25713</td><td>&nbsp;</td><td>Chorme</td><td>&nbsp;</td></tr>
   </table>
</div>'''

soup = BeautifulSoup(doc)
# find the table element in the HTML document
table = soup.find("table")
# grabs the top row
firstRow = table.contents[0]
# find how many columns there are
numberOfColumns = len(firstRow.contents)
restOfRows = table.contents[1:]
for row in restOfRows:
  for x in range(0,numberOfColumns):
    print "column data: %s" % row.contents[x].string

Это извлечет элемент таблицы из любого документа.Затем найдите количество столбцов на основе первой строки.Наконец, он будет проходить по остальным строкам, выводя данные в строке.

Полезная ссылка на документы BS: http://www.crummy.com/software/BeautifulSoup/documentation.html

...