Создание файла CSV со страницы HTML - PullRequest
2 голосов
/ 17 февраля 2012

Я извлек записи из базы данных и сохранил их на HTML-странице только с текстом. Каждая запись сохраняется в поле абзаца <p> и отделяется переносом строки <br /> и строкой <<code>hr>. Например:

Company Name<br/>
555-555-555<br />
Address Line 1<br />
Address Line 2<br />
Website: www.example.com<br />

Мне просто нужно поместить эти записи в файл CSV. Я использовал fputcsv в сочетании с array () и file_get_contents (), но он прочитал весь исходный код веб-страницы в файл .csv, и многие данные также отсутствовали. Это несколько записей, хранящихся в одном формате. Таким образом, после всего блока записи, как показано выше, он разделяется строковым тегом <hr>. Я хочу прочитать название компании в столбце «Имя», номер телефона в столбце «Телефон», адреса в столбце «Адрес» и веб-сайт в столбце «Веб-сайт», как показано ниже.

http://i.stack.imgur.com/00Gxw.png
Как я могу это сделать?

Фрагмент HTML-кода:

            1 Stop Signs<br />
            480-961-7446<br />
500 N. 56th Street<br />
        Chandler, AZ  85226<br />

<br />
                Website: www.1stopsigns.com<br />
            <br />
            </p><br /><hr><br />

В источнике HTML оно расположено примерно так.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Если предположить, что ваши данные следуют шаблону, где каждая запись разделена тегом <hr>, а каждое поле внутри разделено <br />, тогда вы сможете разделить данные.

Есть множество способов сделать это, но наивный способ, который может работать с использованием explode(), может выглядеть примерно так:

// open a file pointer to csv
$fp = fopen('records.csv', 'w');

// first, split each record into a separate array element
$records = explode('<hr>', $str);

// then iterate over this array
foreach ($records as $record) {

    // strip tags and trim enclosing whitespace
    $stripped = trim(strip_tags($record));

    // explode by end-of-line
    $fields = explode(PHP_EOL, $stripped);

    // array walk over each field and trim whitespace
    array_walk($fields, function(&$field) {
        $field = trim($field);
    });

    // create row
    $row = array(
        $fields[0], // name
        $fields[1], // phone
        sprintf('%s, %s', $fields[2], $fields[3]), // address
        $fields[6], // web
    );

    // write cleaned array of fields to csv
    fputcsv($fp, $row);
}

// done
fclose($fp);

Где $str - данные страницы, которые вы анализируете. Надеюсь, это поможет.

EDIT

Первоначально не заметил особых требований к полю. Обновил пример.

2 голосов
/ 17 февраля 2012

Предполагая, что HTML, показанный выше, правильно сформирован, мой подход к этой проблеме должен быть в 2 этапа.Первый.Немного очистите HTML-текст, чтобы повысить эффективность экспорта или управления информацией.Здесь попытайтесь очистить элементы, которые вы хотите сохранить, и удалите те, которые вам не нужны, в ближайшем будущем.

$html = preg_replace("|\s{2,}|si"," ",$html); // clear non neccesary spaces
$html = preg_replace("|\n{2,}|si","\n",$html); // convert more return line to only one
$html = preg_replace("|<br />|si","##",$html); // replace those tags with this one

Тогда у вас будет более чистый html для работы с аналогичнымиэто ....

1 Stop Signs##
480-961-7446##
500 N. 56th Street##
Chandler, AZ  85226##
Website: www.1stopsigns.com##
##
</p>##<hr>##

Второй.Теперь вы можете взорвать поля или сделать имплозу в отдельное значение запятой, чтобы сформировать CSV

// here you'll have the fields to work with into the array called $csv_parts
$csv_parts = explode("##",$html);

// imploding, so there you have the formatted csv similar to 1 Stop Signs,480-961-7446,..
$csv = implode(",",$csv_parts);

Теперь у вас будет два способа работы с HTML для извлечения полей или экспорта CSV.


Надеюсь, это поможет или даст вам идею разработать то, что вам нужно.

2 голосов
/ 17 февраля 2012

Самым простым способом было бы просто взять блок, удалить все из тега <hr> вперед, а затем разбить строку как массив строк на теги <br />.

...