Форум: "Начинающим";
Текущий архив: 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