Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];

Вниз

парсинг HTML?   Найти похожие ветки 

 
Meroveus   (2010-07-19 11:03) [0]

Здравствуйте! Я пришёл за советом как сделать парсинг HTML.
Мне подходит любой компонент/готовый код, т.к. нужно просто автоматизация конкретной задачи (я не программист, а дизайнер).

Например есть такая HTML-страница:

<мусор>Мусор, мусор</мусор>
Мусор
<tr>
<td> Имя:</td>
<td> Вася</td>
</tr>

Мусор
Мусор
Мусор
<мусор>Мусор, мусор</мусор>

<tr>
<td> Фамилия:</td>
<td> Иванов</td>
</tr>

<tr>
<td> Дата рождения:</td>
<td> 1985</td>
</tr>


и так далее.

Находящаяся например по адресу http://zone.site.com/subzone/zone_detail.cfm/ID:1234

Подскажите пожалуйста каким образом сделать так, чтобы скрипт загрузил указанную страницу с веба, взял вторые значения между
тегами <td> и </td> и игнорируя остальной мусор, поместил текст в массив типа:

Вася;   Иванов;   1985


 
И. Павел ©   (2010-07-19 11:06) [1]

RegExpr - очень удобная вещь, рекомендую:
http://rapidshare.com/files/290506639/regexpr.rar


 
И. Павел ©   (2010-07-19 11:08) [2]

> я не программист, а дизайнер

ИМХО тогда с регулярными выражениями могут возникнуть трудности...


 
Meroveus   (2010-07-19 13:24) [3]


> RegExpr - очень удобная вещь, рекомендую:

да, действительно неплохая штука.


> ИМХО тогда с регулярными выражениями могут возникнуть трудности.
> ..

regexp"ом я владею


 
Meroveus   (2010-07-20 10:44) [4]

Все. Решил вопрос без всякого regex"а

unit SDIMAIN;

interface

uses Windows, Classes, Graphics, Forms, Controls, Menus,
 Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList, StdActns,
 ActnList, ToolWin, UrlMon, MSHTML, activex, SysUtils, Variants;

type
 TSDIAppForm = class(TForm)
   StatusBar: TStatusBar;
   Button1: TButton;
   OpenDialog1: TOpenDialog;
   Button2: TButton;
   Memo1: TMemo;
   Edit1: TEdit;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 SDIAppForm: TSDIAppForm;

implementation

uses ABOUT;

function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
 try
   Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
 except
   Result := False;
 end;
end;

//uses about;

{$R *.dfm}

procedure TSDIAppForm.Button1Click(Sender: TObject);
var
 StrURL,
 sFileName   : string;
 SLBody      : TStringList;
 Doc         : IHTMLDocument2;
 v           : OleVariant;
 DocAll,
 DocTR,
 DocTD       : IHTMLElementCollection;
 TRElement,
 TDElement   : IHtmlElement;
 i           : integer;
 f: TextFile; // файл
 fName: string; // имя файла
 buf: string; // буфер для чтения из файла

begin

 fName := Edit1.Text;

 AssignFile(f, fName);
 Reset(f); // открыть для чтения

 // чтение из файла
 while not EOF(f) do
 begin
   readln(f, buf); // прочитать строку из файла

 // сначала загружаем страницу по URL, список которых находится в txt-
//файле

 StrURL := buf;

 SLBody:=TStringList.Create;
 sFileName := ExtractFilePath(Application.ExeName) + "cache.txt";
 if DownloadFile(StrURL,sFileName) then
 SLBody.LoadFromFile(sFileName);
 DeleteFile(sFileName);

 // загружаем все в "WebBrowser". Вернее, создаем объект IHTMLDocument2

 Doc := coHTMLDocument.Create as IHTMLDocument2;
 if Doc = nil then
   begin
     ShowMessage("Ошибка создания IHTMLDocument2");
     exit;
   end;
 v := VarArrayCreate([0,0],VarVariant);
 v[0] := SLBody.Text;
 Doc.write(PSafeArray(TVarData(v).VArray));

 // ищем в DOM-структуре элемент, значение которого нам нужно.
 // для этого сначала анализируем страницу, чтобы определить признаки,
 // которые нам помогут это сделать.
 // то есть надо найти элемент TR, в первом TD которого написано "Name:",
 // и взять значение из второго  TD

 DocAll := Doc.all;
 DocTR  := DocAll.Tags("TR") as IHTMLElementCollection;
 for i := 0 to DocTR.length-1 do
   begin
     TRElement := DocTR.Item(i, 0) as IHtmlElement;
     // находим все дочерние элементы (TD-элементы)
     DocTD := TRElement.children as IHTMLElementCollection;

     // прежде чем обращаться к первому и второму TD-элементу в коллекции,
     // неплохо было бы проверить, есть ли там действительно 2 элемента (или больше)

     if (DocTD.length > 1) then

       begin
         TDElement := DocTD.Item(0, 0) as IHtmlElement;
         // если в первом столбике написано Name, то это то, что мы ищем
         if ( AnsiCompareStr( trim(TDElement.innerText), "Name:") = 0 ) then
           begin
           Memo1.Lines.Add ((DocTD.Item(1, 0) as IHtmlElement).innerText);
           end;
       end;
   end;
 SLBody.Free;
 end;

 CloseFile(f); // закрыть файл
end;

procedure TSDIAppForm.Button2Click(Sender: TObject);
begin
OpenDialog1.Execute;
Edit1.Text := OpenDialog1.FileName;
end;

end.


 
И. Павел ©   (2010-07-21 18:23) [5]


> Meroveus   (20.07.10 10:44) [4]
> Решил вопрос без всякого regex"а

Чтобы отдать должное автору кода, стоило хотя бы написать - "вопрос был решен" :)
http://help.sander.su/aggregator

PS: regexpr почти всегда можно чем-то заменить, но редко это дает более универсальный и понятный код.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.003 c
2-1279515617
Олег Крапивин
2010-07-19 09:00
2010.10.17
Работа с СОМ-портом через ЛВС


2-1279957246
Vladimir
2010-07-24 11:40
2010.10.17
Защита от копирования


15-1279201889
antsa
2010-07-15 17:51
2010.10.17
Мышь в cmd


2-1279726215
KilkennyCat
2010-07-21 19:30
2010.10.17
Возможно ли определить позицию переноса в DrawText?


2-1274281038
Vass
2010-05-19 18:57
2010.10.17
Узнать Top предыдущего элемента в списке TList





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский