Главная страница
    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
3-1246530307
Miau
2009-07-02 14:25
2010.10.17
create table жутко тормозит


2-1276928471
tippa
2010-06-19 10:21
2010.10.17
ведь всего-то 300 метров


6-1194702567
darkevil
2007-11-10 16:49
2010.10.17
Помогите разобраться с компонентом tidsnmp или заменить его.


2-1279523013
Meroveus
2010-07-19 11:03
2010.10.17
парсинг HTML?


2-1279957179
_guest_
2010-07-24 11:39
2010.10.17
можно ли напрямую использовать сишные файлы h и lib





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский