PHP / HTML - многостраничная очистка экрана, экспорт в .txt с запятыми между датами и значениями - PullRequest
1 голос
/ 28 мая 2011

Я пытаюсь почистить веб-страницу (см. Код) - а также те страницы, возвращающиеся во времени (вы можете увидеть дату «20110509» на самой странице) - для простых числовых строк.Кажется, я не могу понять путем проб и ошибок (я новичок в программировании), как анализировать конкретные данные в таблице, которую я хочу.Я пытался использовать простой PHP / HTML без curl или других подобных вещей.Это возможно?Я думаю, что моя основная проблема заключается в использовании разделителей, которые необходимы для получения данных из исходного кода.

Мне бы хотелось, чтобы программа запускалась с самой первой страницы, например, «20050101 ', и просматривайте каждую страницу до текущей даты, извлекая конкретные данные, например, «последнее закрытие» (столбец), «закрывающий рычаг» (строка), и экспортируйте это значение для соответствующей даты в единичное число.TXT-файл, с датой, отделенной от значения запятой.Каждый раз, когда программа запускается, дата / значение должны добавляться к существующему текстовому файлу.

Я знаю, что многие строки кода ниже являются ненужными, это часть моего процесса обучения.

<html>
<title>HTML with PHP</title>
<body>

<?php

$rawdata = file_get_contents('http://online.wsj.com/mdc/public/page/2_3021-tradingdiary2-20110509.html?mod=mdc_pastcalendar');
//$data = substr(' ', $data);
//$begindate = '20050101';
//$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B"); 
//if (preg_match(' <td class="text"> ' , $data , $content)) {
//$content = str_replace($newlines

echo $rawdata;
///file_put_contents( 'NYSETRIN.html' , $content , FILE_APPEND);

?>

<b>some more html</b>

<?php
?>

</body>
</html>

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Хорошо, давайте сделаем это.Мы собираемся сначала загрузить данные в анализатор HTML, а затем создать из него анализатор XPath.XPath поможет нам легко перемещаться по HTML.Итак:

$date = "20110509";
$data = file_get_contents("http://online.wsj.com/mdc/public/page/2_3021-tradingdiary2-{$date}.html?mod=mdc_pastcalendar");

$doc = new DOMDocument();
@$doc->loadHTML($data);

$xpath = new DOMXpath($doc);

Теперь нам нужно получить некоторые данные.Прежде всего давайте возьмем все таблицы данных.Глядя на источник, эти таблицы обозначены классом mdcTable:

$result = $xpath->query("//table[@class='mdcTable']");
echo "Tables found: {$result->length}\n";

Пока:

$ php test.php
Tables found: 5

Хорошо, у нас есть таблицы.Теперь нам нужно получить конкретный столбец.Итак, давайте используем последний закрытый столбец, который вы упомянули:

$result = $xpath->query("//table[@class='mdcTable']/*/td[contains(.,'Latest close')]");
foreach($result as $td) {
  echo "Column contains: {$td->nodeValue}\n";
}

Результат на данный момент:

$ php test.php
Column contains: Latest close
Column contains: Latest close
Column contains: Latest close
... etc ...

Теперь нам нужен индекс столбца для получения конкретного столбца для конкретной строки.Мы делаем это путем подсчета всех предыдущих элементов, а затем добавляем один.Это связано с тем, что селекторы индекса элемента 1 проиндексированы, а не 0 проиндексированы:

$result = $xpath->query("//table[@class='mdcTable']/*/td[contains(.,'Latest close')]");
$column_position = count($xpath->query('preceding::*', $result->item(0))) + 1;
echo "Position is: $column_position\n";

Результат:

$ php test.php
Position is: 2

Теперь нам нужно получить нашу конкретную строку:

$data_row = $xpath->query("//table[@class='mdcTable']/*/td[starts-with(.,'Closing Arms')]");
echo "Returned {$data_row->length} row(s)\n";

Здесь мы используем starts-with, поскольку метка строки содержит символ utf-8.Это облегчает.Результат на данный момент:

$ php test.php
Returned 4 row(s)

Теперь нам нужно использовать индекс столбца, чтобы получить нужные данные:

$data_row = $xpath->query("//table[@class='mdcTable']/*/td[starts-with(.,'Closing Arms')]/../*[$column_position]");
foreach($data_row as $row) {
  echo "{$date},{$row->nodeValue}\n";
}

Результат:

$ php test.php
20110509,1.26
20110509,1.40
20110509,0.32
20110509,1.01

КакойТеперь можно записать в файл.Теперь у нас нет рынков, к которым они применяются, поэтому давайте продолжим и возьмем их:

$headings = array();
$market_headings = $xpath->query("//table[@class='mdcTable']/*/td[@class='colhead'][1]");
foreach($market_headings as $market_heading) {
  $headings[] = $market_heading->nodeValue;
}

Теперь мы можем использовать счетчик, чтобы указать, на каком рынке мы находимся:

$data_row = $xpath->query("//table[@class='mdcTable']/*/td[starts-with(.,'Closing Arms')]/../*[$column_position]");
$i = 0;
foreach($data_row as $row) {
  echo "{$date},{$headings[$i]},{$row->nodeValue}\n";
  $i++;
}

Вывод:

$ php test.php
20110509,NYSE,1.26
20110509,Nasdaq,1.40
20110509,NYSE Amex,0.32
20110509,NYSE Arca,1.01

Теперь для вас:

  • Это можно превратить в функцию, которая принимает дату
  • You 'Вам понадобится код, чтобы выписать файл.Проверьте функции файловой системы для подсказок
  • Это можно сделать расширяемым, чтобы использовать разные столбцы и разные строки
2 голосов
/ 28 мая 2011

Я бы порекомендовал использовать HTML Agility Pack , его HTML-парсер, который очень удобен для поиска определенного содержимого в HTML-документе.

...