CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wycinka śmieci

Wycinka śmieci

dział ogólny

Re: Wycinka śmieci

Nowy postprzez Cyfrowy Baron » czwartek, 28 lutego 2013, 16:31

Wiec tak powinno być dobrze:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include "wininet.h"
#include <memory>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma link "wininet.lib"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
AnsiString ReadFileURL(AnsiString Url)
{
 AnsiString result = "";
 HINTERNET hSession = NULL;
 hSession = InternetOpen("ReadFileURL", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
 if(hSession)
 {
  HINTERNET hService = NULL;
  hService = InternetOpenUrl(hSession, Url.c_str(), NULL, 0, 0, 0 );
  if(hService)
  {
   while(1)
   {
        char lpBuffer[6024 + 1];
    DWORD dwBytesRead;
        InternetReadFile(hService, lpBuffer, 6024, &dwBytesRead);
    if(dwBytesRead == 0) break;
    lpBuffer[dwBytesRead] = 0;
    result += lpBuffer;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return result;
}
//---------------------------------------------------------------------------
std::auto_ptr<TStringList> GetMailTo(AnsiString sMail)
{
 Screen->Cursor = crHourGlass;

 String Value = ReadFileURL(sMail);

 std::auto_ptr< TStringList> Lista(new TStringList);

 int p = Value.Pos("\"mailto:");


 do
 {
  Value = Value.Delete(1, p + 7);
  int x = Value.Pos("\">") - 1;

  Lista->Add( Value.SubString(1, x) );

   p = Value.Pos("\"mailto:");

  }while(p > 0);

 Screen->Cursor = crDefault;

 return Lista;
}
//---------------------------------------------------------------------------
std::auto_ptr<TStringList> GetExtUrl(AnsiString sMail)
{
 Screen->Cursor = crHourGlass;

 String Value = ReadFileURL(sMail);

 std::auto_ptr< TStringList> Lista(new TStringList);

 int p = Value.Pos("href=\"");


 do
 {
  Value = Value.Delete(1, p + 5);

  int x = Value.Pos("\"") - 1;

  if( Value.SubString(1, 7) == "http://" ) Lista->Add( Value.SubString(1, x) );

   p = Value.Pos("href=\"");

  }while(p > 0);

 Screen->Cursor = crDefault;

 return Lista;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
  Memo1->Lines->Assign( GetExtUrl("http://www.komputronik.pl/kontakty/").get() );
}


Zwróć uwagę, że zamiast <a href=" przeszukuję href=" ponieważ pomiędzy a i href mogą wystąpić inne tagi html.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wycinka śmieci

Nowy postprzez nvdante » czwartek, 28 lutego 2013, 16:44

Częściowo dobrze to wychodzi, ale gdy link nie ma przedrostka 'http://' to program się gubi i pomija dane, a przecież często bywa, że jest 'www'.
Próbowałem tak, ale chyba coś pokręciłem:
KOD cpp:     UKRYJ  
  if( Value.SubString(1, 7) == "http://" || Value.SubString(1, 4) == "www.")
        Lista->Add( Value.SubString(1, x) );
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Wycinka śmieci

Nowy postprzez Cyfrowy Baron » czwartek, 28 lutego 2013, 17:45

nvdante napisał(a): ale gdy link nie ma przedrostka 'http://' to program się gubi i pomija dane, a przecież często bywa, że jest 'www'.


Chyba nie rozumiesz jak to działa. Link zewnętrzny zawsze ma http:// może być: http://k24.cz ale może też być http://www.k24.cz, http:// zawsze jest w adresie poza sytuacją gdy adres odnosi się do jakiejś podstrony serwisu, ale w przypadku podstron jest problem z regułą, gdyż nie ma żadnej reguły.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wycinka śmieci

Nowy postprzez nvdante » czwartek, 28 lutego 2013, 17:56

Cyfrowy Baron napisał(a):Chyba nie rozumiesz jak to działa.

Tak, jak już pisaliśmy na priv źle Cię zrozumiałem, ale chętnie zobaczę jaki masz pomysł ;-)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Wycinka śmieci

Nowy postprzez Cyfrowy Baron » czwartek, 28 lutego 2013, 18:12

KOD cpp:     UKRYJ  
std::auto_ptr<TStringList> GetExtUrl(AnsiString sUrl)
{
 Screen->Cursor = crHourGlass;

 String sTab[] = {"#", "http://", "https://", "mailto:", "/favicon", "favicon", "javascript", "/sfMinifyPlugin.php"};

 String Value = ReadFileURL(sUrl);

 std::auto_ptr< TStringList> Lista(new TStringList);

 int p = Value.Pos("href=\"");


 do
 {
  Value = Value.Delete(1, p + 5);

  int x = Value.Pos("\"") - 1;
  bool test = false;

  for(int i = 0; i <  ARRAYSIZE(sTab); i++)
  {
   int l = sTab[i].Length();

   if( Value.SubString(1, l) == sTab[i] )
   {
         test = true;
         break;
   }
  }
   if(!test && x > 1)  Lista->Add( sUrl +  Value.SubString(2, x - 1) ); /* tu się wiele zmieniło */

   p = Value.Pos("href=\"");

  }while(p > 0);

 Screen->Cursor = crDefault;

 return Lista;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
/* przeszukuj stronę główną, nie podstronę */
  Memo1->Lines->Assign( GetExtUrl("http://www.komputronik.pl/").get() );
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 30 gości

cron