Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.17;
Скачать: CL | DM;

Вниз

парсинг 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1280199324
Ш-К
2010-07-27 06:55
2010.10.17
Как отобразить на канве фрагмент метафайла?


2-1279861058
linuxoid
2010-07-23 08:57
2010.10.17
как передать данные массива с основного потока в параллельный?


2-1279637266
Xandr001
2010-07-20 18:47
2010.10.17
Помогите выбрать тип данных


2-1280224684
Кондрат Воронов
2010-07-27 13:58
2010.10.17
Работа с объектами


2-1279611355
beginner
2010-07-20 11:35
2010.10.17
Как разернуть окно на весь экран?