использование scrapy для анализа произвольного числа строк (пары ключ-значение) в HTML-таблице - PullRequest
0 голосов
/ 18 марта 2012

Недавно начал работать с библиотекой Scrapy.Я пытаюсь почистить веб-сайт, на котором есть несколько разных таблиц для каждого продукта, который они продают.В конце концов, я буду использовать данные для заполнения атрибутов объекта.Сейчас мне просто нужно извлечь его в формат JSON.

Вот пример таблицы:

<table id="table_1">
<tr id="row_1">
    <td>cell_1</td>
    <td>cell_2</td>
    <td>cell_3</td>
</tr>
<tr id="row_2">
    <td>cell_4</td>
    <td>cell_5</td>
    <td>cell_6</td>
</tr>
<tr id="row_n">
    <td>cell_x</td>
    <td>cell_y</td>
    <td>cell_z</td>
</tr>
</table>

Каждый столбец представляет отдельный элемент, то есть маленькие, средние или большие футболки.,В приведенной выше таблице будет 3 элемента, поэтому элементы будут выглядеть следующим образом:

Item 1 {
    row_1:cell_1
    row_2:cell_4
    row_n:cell_x
}
Item 2 {
    row_1:cell_2
    row_2:cell_5
    row_n:cell_y
}
Item 3 {
    row_1:cell_3
    row_2:cell_6
    row_n:cell_z
}

Это хорошо структурированные таблицы без «пропущенных» или «лишних» ячеек, хотя количество строк и столбцовпроизвольно.

Сложность, с которой я столкнулся при использовании объекта Предмета Scrapy, так как для этого требуется, чтобы мой класс Предметов определял количество полей перед очисткой, а не на основе таблицы.У меня есть сотни таблиц, над которыми я хочу выполнить этот процесс.

Спасибо, что прочитали это далеко, любая помощь приветствуется.:)

РАЗРЕШЕНИЕ: @warawuk Спасибо за вашу помощь.Я воспользовался твоим предложением и получил тройной вложенный список.Возможно, не идеально, но достаточно просто извлечь значения, так как я продолжаю работать с ними:

{"tRows": 
    [[["row1"], ["cell1", "cell2"]]
    [["row2"], ["cell3", "cell4"]]
    [["row3"], ["cell5", "cell6"]]
    [["row4"], ["cell7", "cell8"]]] x100s of tables
}

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

1 Ответ

1 голос
/ 18 марта 2012

У вас здесь слишком много вопросов, imo.

Прежде всего, похоже, что ваш вопрос вообще не о скрапе.Речь идет об организации ваших данных и xpath.

Я думаю, вы должны разбить свою задачу на подзадачи.Первая подзадача состоит в том, чтобы фактически извлечь данные в структуру данных Python, а затем попытаться обработать их.Из вашей информации, я думаю, что данные будут как:

{
    'table_1': {
        'row_1': ['cell_1', 'cell_2'],
        'row_2': ['cell_1', 'cell_2'],
        ...
    },
    'table_2': {
        'row_1': ['cell_1', 'cell_2', 'cell_3'],
        'row_2': ['cell_1', 'cell_2', 'cell_3'],
        ...
    },
}

Это правильно?


ОБНОВЛЕНИЕ:

Трудность, с которой я столкнулся, заключалась в использовании объекта Item Scrapy, так как для этого требуется, чтобы мой класс Item определял количество полей перед очисткой, а не на основе таблицы.У меня есть сотни таблиц, для которых я хочу выполнить этот процесс.

AFAIK, Поля элементов могут хранить любой объект Python .Класс Scrapy Item - это просто место, где вы храните Field s, но Scrapy не обрабатывает эти поля особым образом.Только вы берете эти поля в конвейер и интерпретируете данные в них.

Поэтому выберите любой формат магазина, который вам подходит.Например:

class Shirt(Item):
    available_sizes = Field() # [(size1, amount1), (size2, amount2), ...] or {size1: amount1, size2: amount2, ...} if `size` is a hashable object
...