ФорумПрограммированиеPHP для идиотов → Помогите разобраться с парсингом html-страниц

Помогите разобраться с парсингом html-страниц

  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 11 февраля 2010 г. 15:35

    Помогите разобраться ламеру. Суть проблемы: есть куча (около 1000) html-файлов, все одинаковые по построению но разные по текстовому наполнению (то есть количество строк в каждом файле разная). Мне нужно выдрать из файлов содержимое трех <textarea></textarea> и одну ссылку на картинку. Файл я разбираю на строчки и пишу в массив, по массиву бегаю циклом и ищу нужные мне строки, потом следующим циклом я вынимаю содержимое textarea.

    Вот такой вид имеет файл

    1:<textarea rows="7" name="Referenz" cols="39" style="font-family : Verdana; height:130; font-size:10pt; background-color:#F5F5F5">
    2:<!–содержимое textarea с любым количеством строк –>
    3:</textarea>

    6:<textarea rows="7" name="OEM" cols="39" style="font-family : Verdana; height:130; font-size:10pt; background-color:#F5F5F5; width:295">
    7:<!–содержимое textarea с любым количеством строк –>
    8:</textarea>

    10:<p><img src="../images/Bilder_Belts/p.jpg" style="border: 2px solid #808080" width="200" height="257"></p></form>

    12:<textarea rows="5" name="Applikat" cols="83" style="font-family : Verdana; width:695; height:157; font-size:10pt; background-color:#F5F5F5">
    13:<!–содержимое textarea с любым количеством строк –>
    14:</textarea>

    вот что у меня получается

    1:<textarea rows="7" name="Referenz" cols="39" style="font-family : Verdana; height:130; font-size:10pt; background-color:#F5F5F5">
    3:</textarea>
    6:<textarea rows="7" name="OEM" cols="39" style="font-family : Verdana; height:130; font-size:10pt; background-color:#F5F5F5; width:295">
    8:</textarea>
    10:<p><img src="../images/Bilder_Belts/p.jpg" style="border: 2px solid #808080" width="200" height="257"></p></form>
    12:<textarea rows="5" name="Applikat" cols="83" style="font-family : Verdana; width:695; height:157; font-size:10pt; background-color:#F5F5F5">
    14:</textarea>

    а содержимое textaerea то которое мне нужно только у первого блока, все остальные блоки в содержимое добавляются куски html-кода, потому что </textarea> в 3-х случаях одинаков

    Вот php-портянка

    dir = 'D:/SCT/SCT/KATALOGSCT/BREMSE/';
    foreach(glob($dir . '*.HTML') as $file) {
    $f = fopen($file, "rt");
    $lines = explode("\n", fread($f, filesize($file)));

    for ($i = 0; $i < 70; $i++){

    $pattern = '<textarea rows="7" name="Referenz" cols="39" style="font-family : Verdana; height:140; font-size:10pt; background-color:#F5F5F5">';
    if(ereg($pattern, $lines[$i], $array)){
    $y = $i;
    print_r($array);
    echo '~';
    echo $y;
    echo '~';
    }

    $pattern1 = '<textarea rows="7" name="OEM" cols="39" style="font-family : Verdana; height:140; font-size:10pt; background-color:#F5F5F5; width:295">';
    if(ereg($pattern1, $lines[$i], $array)){
    $b = $i;
    print_r($array);
    echo '~';
    echo $b;
    echo '~';
    }

    $pattern2 = '</textarea>';
    if(ereg($pattern2, $lines[$i], $array1)){
    $x = $i;
    print_r($array1);
    echo '~';
    echo $x;
    echo '~';
    }

    echo '~';
    for ($i1 = $y+1; $i1 < $x; $i1++){
    echo $lines[$i1];
    }
    echo '~';
    for ($i2 = $b+1; $i2 < $x; $i2++){
    echo $lines[$i2];
    }
    echo '~<';
    }
    }
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 11 февраля 2010 г. 15:38, спустя 2 минуты 31 секунду

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 11 февраля 2010 г. 16:57, спустя 1 час 19 минут 17 секунд

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 11 февраля 2010 г. 17:10, спустя 12 минут 47 секунд


    Хватит юзать ereg!
    юзай мозггГГ
    Сапожник без сапог
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 12 февраля 2010 г. 4:08, спустя 10 часов 57 минут 58 секунд

    Это я понял, уже заменил, спс за корректировку
    Подскажите как мне получить правильные номера строк первого, второго, и третьго совпадения </textarea>, а то у меня сравнение неправильное происходит (то есть 1: с 3:, 6: c 3:, 10: c 3:).
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 12 февраля 2010 г. 4:12, спустя 4 минуты 37 секунд

    grep -n
    adw/0
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 12 февраля 2010 г. 4:38, спустя 26 минут 1 секунду

    preg_match_all("#<textarea .*>(.*)</textarea>#iUs", $tvoy_html, $output_array_textareas);
    preg_match_all("#<img.*src.*=.*\\\"(.*)\\\".*>#iUs", $tvoy_html, $output_array_imgs);

    Нахуя такой код писать, когда все можно вот так сделать?
    Регулярки конечно не самые оптимальные. Но можно и так.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 12 февраля 2010 г. 4:46, спустя 7 минут 41 секунду

    SpartakuS, уверен - будут проблемы из-за отсутствия квантификаторов жадности (.*?)
    adw/0
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 12 февраля 2010 г. 4:52, спустя 6 минут

    adw0rd, пыхорегексп говорит, что все норм. А как же модификатор U?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 12 февраля 2010 г. 4:52, спустя 23 часа 59 минут 47 секунд

    SpartakuS, я даже не знаю зачем он :)
    adw/0
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 12 февраля 2010 г. 4:56, спустя 4 минуты 23 секунды

    Он инвертирует жадность. Вот пример:
    <div>первый</div>междивов<div>Второй</div>

    Регулярка:
    #<div>(.*)</div>#

    вернет
    первый</div>междивов<div>Второй

    А
    #<div>(.*)</div>#U

    вернет
    первый

    Второй
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 12 февраля 2010 г. 5:04, спустя 7 минут 52 секунды

    gvik,
    for ($i = 0; $i < 70; $i++){

    foreach
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 12 февраля 2010 г. 5:08, спустя 3 минуты 48 секунд


    gvik,
    for ($i = 0; $i < 70; $i++){

    foreach

    это для отладки, там count($lines)
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 12 февраля 2010 г. 5:09, спустя 1 минуту 6 секунд

    SpartakuS, хз, на мой взгляд не так он и полезен… я лучше где мне точно надо поставлю "?"
    adw/0
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 12 февраля 2010 г. 5:21, спустя 12 минут 4 секунды

    adw0rd, а как этот модифицируешь?
    #<td>(.*)</td>#

    Под исходник пыхи (форума) например?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!