• 1
  • 2
2020-12-05, 22:09
  #13
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av distans
Ja, om man pratar regexp flytande

Denna kanske kan vara till hjlp?!

https://stackoverflow.com/questions/...data-from-html

Ah, jag lste trdstarten slarvigt, trodde TS ville ha hela raden. D ska det in lite awk eller sed i grep-uttrycket ocks. Men det r rtt ltt att googla fram hur man gr.
Citera
2020-12-06, 08:09
  #14
Medlem
Citat:
Ursprungligen postat av ath0
Kod:
preg_match('/<span class="hittamig">(.*?)<\/span>/s'$results$matches);
if(
count($matches) >= 2) {
    
$result $matches[1];
    
$numeric preg_replace("/[^0-9]/"""$result);
    echo 
"Original match: " $result."\r\n";
    echo 
"Numerically parsed match: " $numeric."\r\n";


Ovanstende producerar fljande resultat.

Lter ju fr bra, men r jag fr trtt nu tro?

Kod:
Warning: Undefined variable $results in curl.php on line 122

122:preg_match('/<span class="hittamig">(.*?)<\/span>/s', $results, $matches); 

Kod:
preg_match('/<span class="hittamig">(.*?)<\/span>/s'$results$matches); 
if(
count($matches) >= 2) { 
    
$result $matches[1]; 
    
$numeric preg_replace("/[^0-9]/"""$result); 
    echo 
"Original match: " $result."\r\n"
    echo 
"Numerically parsed match: " $numeric."\r\n"

__________________
Senast redigerad av matematikern88 2020-12-06 kl. 08:14.
Citera
2020-12-06, 12:33
  #15
Medlem
SKetchers avatar
Citat:
Ursprungligen postat av matematikern88
Lter ju fr bra, men r jag fr trtt nu tro?

Hej, du r nstan dr. Men du anvnder regex p ett icke optimalt stt.
Istllet fr att regexa hela sidan "<html>3ta3546354....mkht13tyjyjkyjkeafa asmycket text som vi inte behver ska igenom[...........] <span>5 bilar</span><html>", vilket kan bli ondigt snurrigt, s vljer vi ut Dom-noden <span> som du vill ha.

Drifrn konvertrar vi stringvrdet "5 bilar" till en siffra -> 5

Jag grvde fram en bit gammal kod frn mitt bibliotek.
Kod:
// Min lokala server
$targetSite "http://127.0.0.1:5500/index2.html";
// Hmtar data genom ett Curlrequest
$dom XpathFromUrl($targetSite);

// Vi sker igenom HTML-document med Xpath istllet
// Alla <span> med klassen "hittamig" tas ut och loopas
foreach ($dom->query('//span[@class="hittamig"]') as $tag) {
    
$str $tag->nodeValue// 5 bilar
    // Vi komnvertar stringen '5 bilar' till en int genom att ta bort allting som r icke-numeriskt ![0-9]
    
$str preg_replace('~\D~'''$str);
    echo 
$str;
}

/**
 * Get request to address
 */
function CurlRequest($url)
{
    
$curl curl_init();
    
curl_setopt($curlCURLOPT_URL$url);
    
curl_setopt($curlCURLOPT_HTTPHEADER, array(
        
"Rofl-Copter: haha. look at me, i'm a header",
        
"User-Agent: {Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)}",
        
"Accept-Language: {en-us,en;q=0.5}"
    
));
    
curl_setopt($curlCURLOPT_HEADER1);
    
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
    
$result curl_exec($curl);
    
$info curl_getinfo($curl);
    
curl_close($curl);
    return 
$result;
}

/**
 * Convert DOMDocument -into-> DOMXPath
 */
function XpathFromUrl($url)
{
    
//$res = file_get_contents($url);
    
$res CurlRequest($url);
    
libxml_use_internal_errors(true);
    
$domdoc  = new DOMDocument();
    
$domdoc->loadHTML($res);
    
$dom = new DOMXPath($domdoc);
    return 
$dom;


Kod:
$targetSite 
r adressen dr html ligger, exempelvis "https://www.flashback.org".
D jag inte vet hur du gr sjlva requesten med Curl kan du grna anvnda mina tv funktioner.
__________________
Senast redigerad av SKetcher 2020-12-06 kl. 12:38.
Citera
2020-12-06, 17:06
  #16
Medlem
Citat:
Ursprungligen postat av SKetcher
Hej, du r nstan dr. Men du anvnder regex p ett icke optimalt stt.
Istllet fr att regexa hela sidan "<html>3ta3546354....mkht13tyjyjkyjkeafa asmycket text som vi inte behver ska igenom[...........] <span>5 bilar</span><html>", vilket kan bli ondigt snurrigt, s vljer vi ut Dom-noden <span> som du vill ha.

Drifrn konvertrar vi stringvrdet "5 bilar" till en siffra -> 5

Jag grvde fram en bit gammal kod frn mitt bibliotek.
Kod:
// Min lokala server
$targetSite "http://127.0.0.1:5500/index2.html";
// Hmtar data genom ett Curlrequest
$dom XpathFromUrl($targetSite);

// Vi sker igenom HTML-document med Xpath istllet
// Alla <span> med klassen "hittamig" tas ut och loopas
foreach ($dom->query('//span[@class="hittamig"]') as $tag) {
    
$str $tag->nodeValue// 5 bilar
    // Vi komnvertar stringen '5 bilar' till en int genom att ta bort allting som r icke-numeriskt ![0-9]
    
$str preg_replace('~\D~'''$str);
    echo 
$str;
}

/**
 * Get request to address
 */
function CurlRequest($url)
{
    
$curl curl_init();
    
curl_setopt($curlCURLOPT_URL$url);
    
curl_setopt($curlCURLOPT_HTTPHEADER, array(
        
"Rofl-Copter: haha. look at me, i'm a header",
        
"User-Agent: {Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)}",
        
"Accept-Language: {en-us,en;q=0.5}"
    
));
    
curl_setopt($curlCURLOPT_HEADER1);
    
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
    
$result curl_exec($curl);
    
$info curl_getinfo($curl);
    
curl_close($curl);
    return 
$result;
}

/**
 * Convert DOMDocument -into-> DOMXPath
 */
function XpathFromUrl($url)
{
    
//$res = file_get_contents($url);
    
$res CurlRequest($url);
    
libxml_use_internal_errors(true);
    
$domdoc  = new DOMDocument();
    
$domdoc->loadHTML($res);
    
$dom = new DOMXPath($domdoc);
    return 
$dom;


Kod:
$targetSite 
r adressen dr html ligger, exempelvis "https://www.flashback.org".
D jag inte vet hur du gr sjlva requesten med Curl kan du grna anvnda mina tv funktioner.

Fick bara ut en blank sida av din kod nr jag la den i en ny fil. Testade att mixtra lite, men fick inte till det. S hr ser min kod ut. Den ligger in p min hemsida nu som test.
Sen plockar den ut all html i $result;.
Och dr vill jag hitta min 5a (<span class="hittamig">)

Kod:
$data = array(
    
"email_signin" => "mail@.nu",
    
"password_signin" => "OLLE",
    
"login" => "submit"
);

$ch curl_init("http://www.URL.se/index.php");
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
curl_setopt($chCURLOPT_POSTtrue);
curl_setopt($chCURLOPT_POSTFIELDS$data);
curl_setopt($chCURLOPT_COOKIEJAR'cookie.txt');
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);

$result curl_exec($ch);
curl_close($ch);
echo 
$result



EDIT: Ditt fungerade klockrent! Men hur gr jag om jag behver logga in frst? Det r p sidan efter inloggningen <span "hittamig"> ligger. Tusen tack fr du hjlpt mig s hr lngt!
__________________
Senast redigerad av matematikern88 2020-12-06 kl. 17:17.
Citera
2020-12-06, 22:20
  #17
Medlem
SKetchers avatar
Citat:
Ursprungligen postat av matematikern88
EDIT: Ditt fungerade klockrent! Men hur gr jag om jag behver logga in frst? Det r p sidan efter inloggningen <span "hittamig"> ligger. Tusen tack fr du hjlpt mig s hr lngt!
Najs, snyggt jobbat. Jag glmde nmna att curl-request antagligen inte funkar p lokala filer. Jag hade en server igng.

Hr kommer vi in p ntverk. Fr att rknas som "inloggad" p en hemsida krver det att webblsaren sparar en cookie eller liknande.

En vanlig inloggning brukar vara ungefr s hr;
1. Du skickar ett inloggningsanrop ->
2. Servern svarar med en cookie ->
3. Webblsaren sparar cookie och fljer hemsidans redirekt ->
4. Hemsidan lser din cookie och sparkar ut dig om du r ngonstans dr du inte ska vara

Problemet r att vi inte kan klicka p en knapp nr vi gr ett sdant hr GET-request, istllet behver man veta adressen som punkt 1-2 skickar till. Om det r din egen hemsida lr du noga redan veta (typ hemsida.se/POST.php eller nt), annars kan du ppna Devtools och aktivera network-tabben fr att set var din info skickas till efter att du klickat login.

S med den information kan du hrma detta i ett curl POST-request typ->
Kod:
$data = ['username' => 'admin''password' => '12345'];
curl_setopt($chCURLOPT_POSTFIELDS$data); 

Och datan som kommer tillbaka innehller frhoppningsvis ngot du kan anvnda
Kod:
$returnDataSomething curl_exe yada yada
// Cookiedata spara ngonstans 

S med andra r det egentligen tv skript;
  1. Logga in och f tillbaka cookie-data som sparas
  2. Ladda cookiedata och g direkt till vilken sida du vill

Om jag har tid nsta vecka, kan jag eventuellt gra ett login-exempel med flashback.org istllet.
__________________
Senast redigerad av SKetcher 2020-12-06 kl. 22:34.
Citera
2020-12-07, 00:01
  #18
Medlem
Citat:
Ursprungligen postat av matematikern88
Lter ju fr bra, men r jag fr trtt nu tro?

Kod:
Warning: Undefined variable $results in curl.php on line 122

122:preg_match('/<span class="hittamig">(.*?)<\/span>/s', $results, $matches); 

Kod:
preg_match('/<span class="hittamig">(.*?)<\/span>/s'$results$matches); 
if(
count($matches) >= 2) { 
    
$result $matches[1]; 
    
$numeric preg_replace("/[^0-9]/"""$result); 
    echo 
"Original match: " $result."\r\n"
    echo 
"Numerically parsed match: " $numeric."\r\n"

$results r ju sklart variabeln som innehller ditt resultat frn curl-anropet.
Tror sjlv du anvnde den variabeln i ditt originalinlgg.

Koden fungerar som du tnker sig, ska du hmta ngonting bakom inlogg behver du frst spara ned cookies och teranvnda dessa i anropet nr du hmtar sidan igen.

Edit: i ditt fall br den heta $result.
__________________
Senast redigerad av ath0 2020-12-07 kl. 00:18.
Citera
2020-12-07, 00:17
  #19
Medlem
Citat:
Ursprungligen postat av SKetcher
Hej, du r nstan dr. Men du anvnder regex p ett icke optimalt stt.
Istllet fr att regexa hela sidan "<html>3ta3546354....mkht13tyjyjkyjkeafa asmycket text som vi inte behver ska igenom[...........] <span>5 bilar</span><html>", vilket kan bli ondigt snurrigt, s vljer vi ut Dom-noden <span> som du vill ha.

Du mikro-optimerar om du tror att regex r sltt p den HTML-koden som tillhandahlls i TS.
Benchmarka grna men jag tror inte direkt du vinner nt p att loopa igenom alla element och drefter kra regex.
Utver det fr du en mer lsbar kod skulle jag vilja sga.
Citera
2020-12-07, 05:06
  #20
Medlem
Citat:
Ursprungligen postat av SKetcher
Najs, snyggt jobbat. Jag glmde nmna att curl-request antagligen inte funkar p lokala filer. Jag hade en server igng.

Hr kommer vi in p ntverk. Fr att rknas som "inloggad" p en hemsida krver det att webblsaren sparar en cookie eller liknande.

En vanlig inloggning brukar vara ungefr s hr;
1. Du skickar ett inloggningsanrop ->
2. Servern svarar med en cookie ->
3. Webblsaren sparar cookie och fljer hemsidans redirekt ->
4. Hemsidan lser din cookie och sparkar ut dig om du r ngonstans dr du inte ska vara

Problemet r att vi inte kan klicka p en knapp nr vi gr ett sdant hr GET-request, istllet behver man veta adressen som punkt 1-2 skickar till. Om det r din egen hemsida lr du noga redan veta (typ hemsida.se/POST.php eller nt), annars kan du ppna Devtools och aktivera network-tabben fr att set var din info skickas till efter att du klickat login.

S med den information kan du hrma detta i ett curl POST-request typ->
Kod:
$data = ['username' => 'admin''password' => '12345'];
curl_setopt($chCURLOPT_POSTFIELDS$data); 

Och datan som kommer tillbaka innehller frhoppningsvis ngot du kan anvnda
Kod:
$returnDataSomething curl_exe yada yada
// Cookiedata spara ngonstans 

S med andra r det egentligen tv skript;
  1. Logga in och f tillbaka cookie-data som sparas
  2. Ladda cookiedata och g direkt till vilken sida du vill

Om jag har tid nsta vecka, kan jag eventuellt gra ett login-exempel med flashback.org istllet.

Jag skulle vilja komma i kontakt med dig p e-post. Jag fr inte skicka PM till dig (har under 50-forum inlgg.) Du har inte lust att dra ett e-post till mig? S ska jag bertta mer.
Citera
2020-12-07, 15:32
  #21
Medlem
SKetchers avatar
Citat:
Ursprungligen postat av ath0
Du mikro-optimerar om du tror att regex r sltt p den HTML-koden som tillhandahlls i TS.
Benchmarka grna men jag tror inte direkt du vinner nt p att loopa igenom alla element och drefter kra regex.
Utver det fr du en mer lsbar kod skulle jag vilja sga.
Det har du rtt i, att html-biten r alldeles fr kort fr att det ska spela ngon roll i performance.

Men. Det r en enorm anti-pattern att parsa HTML med regex. Alla moderna programmeringssprk har fullstndiga verktyg fr just det hr syften, att blddra i DOM-trdet. En lista med objekt r s mycket mer hanterbart n en enorm string.

Det som regexas i min kodsnutt r enbart vrdet frn DOM-noden fr att parsa en string till int, har ingenting med skande att gra.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in