![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
парсинг HTML?
Meroveus © (2010-07-19 11:03:00)Здравствуйте! Я пришёл за советом как сделать парсинг 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-21 18:23:00) [1]
> Meroveus (20.07.10 10:44) [4]
> Решилвопрос без всякого regex'а
Чтобы отдать должное автору кода, стоило хотя бы написать - "вопрос был решен" :)
http://help.sander.su/aggregator
PS: regexpr почти всегда можно чем-то заменить, но редко это дает более универсальный и понятный код.
Meroveus (2010-07-20 10:44:00) [2]Все. Решил вопрос без всякого 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.
Meroveus (2010-07-19 13:24:00) [3]
> RegExpr - очень удобная вещь, рекомендую:
да, действительно неплохая штука.
> ИМХО тогда с регулярными выражениями могут возникнуть трудности.
> ..
regexp'ом я владею
И. Павел (2010-07-19 11:08:00) [4]> я не программист, а дизайнер
ИМХО тогда с регулярными выражениями могут возникнуть трудности...
И. Павел (2010-07-19 11:06:00) [5]RegExpr - очень удобная вещь, рекомендую:
http://rapidshare.com/files/290506639/regexpr.rar