Html kodunda iki dize ayıklayın

Aşağıdaki yapıya sahip bir HTML tablosu var:

<tr>
    <td class='tablesortcolumn'>atest</td>
    <td >Kunde</td>
    <td >[email protected]</td>
    <td align="right">  </td>
</tr>

Bu tr bloklarının yüzlerce tanesi var.

I want to extract atest and [email protected]

Aşağıdakileri denedim:

$document = new DOMDocument();
$document->loadHTML($data);
$selector = new DOMXPath($document);
$elements = $selector->query("//*[contains(@class, 'tablesortcolumn')]");

foreach($elements as $element) {
  $text = $element->nodeValue;
  print($text);
  print('
'); }

En azından ayıklamak sorun değil, çünkü öğeyi tablesortcolumn sınıfıyla alabilirim. E-posta adresini nasıl alabilirim?

I cannot simply use //table/tr/td/a because there are other elements on the website which are structured like this. So I need to get it by choosing an empty href tag. I already tried //table/tr/td/a[contains(@href, '')] but it returns the same as with //table/tr/td/a

Bunu nasıl çözeceği konusunda fikri olan var mı?

2
takip eden kardeşin gibi bir xpath ekseni, eğer "e-posta" TD'sinin "atest" TD'den sonra her zaman iki TD ise, size bu konuda yardımcı olabilirdi. Sadece söylüyorum.
katma yazar hakre, kaynak
takip eden kardeşin gibi bir xpath ekseni, eğer "e-posta" TD'sinin "atest" TD'den sonra her zaman iki TD ise, size bu konuda yardımcı olabilirdi. Sadece söylüyorum.
katma yazar hakre, kaynak

9 cevap

@ dizesini içeren bir xpath çalıştırabilir misiniz? Bunun başka bir şey için kullanılması pek mümkün görünmüyor.

yani böyle bir şey işe yarayabilir

//*[text()[contains(.,'@')]]
2
katma
evet, sadece veya kullanın. Bunun gibi içerir (@class, 'tablesortcolumn') veya içerir (etc ....)
katma yazar nomistic, kaynak
iyi bir nokta. ve evet, sizinkini daha çok seviyorum; Daha önce html'de, örneğin bir satır sonu gibi oluşabilecek başka bir iç içe düğüm olması durumunda problemleri gördüm. Ayrıca re: regex ... Sadece şunu söyledim çünkü bu kişisel bir görüş ve ayrıca büyük ölçüde de regex başımı döndürüyor;
katma yazar nomistic, kaynak
bu harika :)
katma yazar nomistic, kaynak
Yapısal verilerle uğraşıyorsanız, regex'ten çok daha kolay olduğunu anlıyorum.
katma yazar nomistic, kaynak
Yapısal verilerle uğraşıyorsanız, regex'ten çok daha kolaydır . Bu kullanışlı olamayacak kadar genel bir ifade. Ayrıca, //*Гtext()QLcontains(.,'@ ')]]] hantaldır, lütfen //* [içerir (text (),' @ 'olarak değiştirin. )]
katma yazar Mathias Müller, kaynak
Xpath'in bu kadar güçlü bir araç olduğunu düşünmedim. :) Teşekkürler!
katma yazar Vince, kaynak
Bu çalışır! Teşekkür ederim. Şimdi, atest[email protected] ile nasıl birleştirebilirim? Bir OR koşulu gibi bir şey var mı?
katma yazar Vince, kaynak

@ dizesini içeren bir xpath çalıştırabilir misiniz? Bunun başka bir şey için kullanılması pek mümkün görünmüyor.

yani böyle bir şey işe yarayabilir

//*[text()[contains(.,'@')]]
2
katma
iyi bir nokta. ve evet, sizinkini daha çok seviyorum; Daha önce html'de, örneğin bir satır sonu gibi oluşabilecek başka bir iç içe düğüm olması durumunda problemleri gördüm. Ayrıca re: regex ... Sadece şunu söyledim çünkü bu kişisel bir görüş ve ayrıca büyük ölçüde de regex başımı döndürüyor;
katma yazar nomistic, kaynak
evet, sadece veya kullanın. Bunun gibi içerir (@class, 'tablesortcolumn') veya içerir (etc ....)
katma yazar nomistic, kaynak
Yapısal verilerle uğraşıyorsanız, regex'ten çok daha kolay olduğunu anlıyorum.
katma yazar nomistic, kaynak
bu harika :)
katma yazar nomistic, kaynak
Yapısal verilerle uğraşıyorsanız, regex'ten çok daha kolaydır . Bu kullanışlı olamayacak kadar genel bir ifade. Ayrıca, //*Гtext()QLcontains(.,'@ ')]]] hantaldır, lütfen //* [içerir (text (),' @ 'olarak değiştirin. )]
katma yazar Mathias Müller, kaynak
Xpath'in bu kadar güçlü bir araç olduğunu düşünmedim. :) Teşekkürler!
katma yazar Vince, kaynak
Bu çalışır! Teşekkür ederim. Şimdi, atest[email protected] ile nasıl birleştirebilirim? Bir OR koşulu gibi bir şey var mı?
katma yazar Vince, kaynak

@ dizesini içeren bir xpath çalıştırabilir misiniz? Bunun başka bir şey için kullanılması pek mümkün görünmüyor.

yani böyle bir şey işe yarayabilir

//*[text()[contains(.,'@')]]
2
katma
iyi bir nokta. ve evet, sizinkini daha çok seviyorum; Daha önce html'de, örneğin bir satır sonu gibi oluşabilecek başka bir iç içe düğüm olması durumunda problemleri gördüm. Ayrıca re: regex ... Sadece şunu söyledim çünkü bu kişisel bir görüş ve ayrıca büyük ölçüde de regex başımı döndürüyor;
katma yazar nomistic, kaynak
evet, sadece veya kullanın. Bunun gibi içerir (@class, 'tablesortcolumn') veya içerir (etc ....)
katma yazar nomistic, kaynak
Yapısal verilerle uğraşıyorsanız, regex'ten çok daha kolay olduğunu anlıyorum.
katma yazar nomistic, kaynak
bu harika :)
katma yazar nomistic, kaynak
Yapısal verilerle uğraşıyorsanız, regex'ten çok daha kolaydır . Bu kullanışlı olamayacak kadar genel bir ifade. Ayrıca, //*Гtext()QLcontains(.,'@ ')]]] hantaldır, lütfen //* [içerir (text (),' @ 'olarak değiştirin. )]
katma yazar Mathias Müller, kaynak
Xpath'in bu kadar güçlü bir araç olduğunu düşünmedim. :) Teşekkürler!
katma yazar Vince, kaynak
Bu çalışır! Teşekkür ederim. Şimdi, atest[email protected] ile nasıl birleştirebilirim? Bir OR koşulu gibi bir şey var mı?
katma yazar Vince, kaynak

Aşağıdaki XPath ifadesi tam olarak istediğinizi yapar

//*[@class = 'tablesortcolumn' or contains(text(),'@')]

Gösterdiğiniz giriş belgesini kullanarak ( ------------- ile ayrılan bireysel sonuçlar) elde edilir:

<td class="tablesortcolumn">atest</td>
-----------------------
[email protected]
1
katma
Bu, bu durum için benimkinden daha iyi bir cevap.
katma yazar nomistic, kaynak
Kesinlikle! Çok teşekkür ederim.
katma yazar Vince, kaynak

Aşağıdaki XPath ifadesi tam olarak istediğinizi yapar

//*[@class = 'tablesortcolumn' or contains(text(),'@')]

Gösterdiğiniz giriş belgesini kullanarak ( ------------- ile ayrılan bireysel sonuçlar) elde edilir:

<td class="tablesortcolumn">atest</td>
-----------------------
[email protected]
1
katma
Bu, bu durum için benimkinden daha iyi bir cevap.
katma yazar nomistic, kaynak
Kesinlikle! Çok teşekkür ederim.
katma yazar Vince, kaynak

Bir e-posta alanı arıyorsanız, regex kullanabilirsiniz. İşte bir makaledir bu faydalı olabilir.

DÜZENLEME

Nisse Engström'e göre, blogun düşmesi durumunda makalenin ilginç bölümünü buraya koyacağım. Tavsiye için teşekkürler.

// Supress xml parsing errors (this is needed to parse Wikipedia's XHTML)
libxml_use_internal_errors(true);

// Load the PHP Wikipedia article
$domDoc = new DOMDocument();
$domDoc->load('http://en.wikipedia.org/wiki/PHP');

// Create XPath object and register the XHTML namespace
$xPath = new DOMXPath($domDoc);
$xPath->registerNamespace('html', 'http://www.w3.org/1999/xhtml');

// Register the PHP namespace if you want to call PHP functions
$xPath->registerNamespace('php', 'http://php.net/xpath');

// Register preg_match to be available in XPath queries 
//
// You can also pass an array to register multiple functions, or call 
// registerPhpFunctions() with no parameters to register all PHP functions
$xPath->registerPhpFunctions('preg_match');

// Find all external links in the article  
$regex = '@^http://[^/]+(?query("//html:a[ php:functionString('preg_match', '$regex', @href) > 0 ]");

// Print out matched entries
echo "Found " . (int) $links->length . " external linksnn";
foreach($links as $linkDom) { /* @var $entry DOMElement */
    $link = simplexml_import_dom($linkDom);
    $desc = (string) $link;
    $href = (string) $link['href'];

    echo " - ";
    if ($desc && $desc != $href) {
        echo "$desc: ";
    } 
    echo "$href\n";
}
1
katma

Bir e-posta alanı arıyorsanız, regex kullanabilirsiniz. İşte bir makaledir bu faydalı olabilir.

DÜZENLEME

Nisse Engström'e göre, blogun düşmesi durumunda makalenin ilginç bölümünü buraya koyacağım. Tavsiye için teşekkürler.

// Supress xml parsing errors (this is needed to parse Wikipedia's XHTML)
libxml_use_internal_errors(true);

// Load the PHP Wikipedia article
$domDoc = new DOMDocument();
$domDoc->load('http://en.wikipedia.org/wiki/PHP');

// Create XPath object and register the XHTML namespace
$xPath = new DOMXPath($domDoc);
$xPath->registerNamespace('html', 'http://www.w3.org/1999/xhtml');

// Register the PHP namespace if you want to call PHP functions
$xPath->registerNamespace('php', 'http://php.net/xpath');

// Register preg_match to be available in XPath queries 
//
// You can also pass an array to register multiple functions, or call 
// registerPhpFunctions() with no parameters to register all PHP functions
$xPath->registerPhpFunctions('preg_match');

// Find all external links in the article  
$regex = '@^http://[^/]+(?query("//html:a[ php:functionString('preg_match', '$regex', @href) > 0 ]");

// Print out matched entries
echo "Found " . (int) $links->length . " external linksnn";
foreach($links as $linkDom) { /* @var $entry DOMElement */
    $link = simplexml_import_dom($linkDom);
    $desc = (string) $link;
    $href = (string) $link['href'];

    echo " - ";
    if ($desc && $desc != $href) {
        echo "$desc: ";
    } 
    echo "$href\n";
}
1
katma

Bir e-posta alanı arıyorsanız, regex kullanabilirsiniz. İşte bir makaledir bu faydalı olabilir.

DÜZENLEME

Nisse Engström'e göre, blogun düşmesi durumunda makalenin ilginç bölümünü buraya koyacağım. Tavsiye için teşekkürler.

// Supress xml parsing errors (this is needed to parse Wikipedia's XHTML)
libxml_use_internal_errors(true);

// Load the PHP Wikipedia article
$domDoc = new DOMDocument();
$domDoc->load('http://en.wikipedia.org/wiki/PHP');

// Create XPath object and register the XHTML namespace
$xPath = new DOMXPath($domDoc);
$xPath->registerNamespace('html', 'http://www.w3.org/1999/xhtml');

// Register the PHP namespace if you want to call PHP functions
$xPath->registerNamespace('php', 'http://php.net/xpath');

// Register preg_match to be available in XPath queries 
//
// You can also pass an array to register multiple functions, or call 
// registerPhpFunctions() with no parameters to register all PHP functions
$xPath->registerPhpFunctions('preg_match');

// Find all external links in the article  
$regex = '@^http://[^/]+(?query("//html:a[ php:functionString('preg_match', '$regex', @href) > 0 ]");

// Print out matched entries
echo "Found " . (int) $links->length . " external linksnn";
foreach($links as $linkDom) { /* @var $entry DOMElement */
    $link = simplexml_import_dom($linkDom);
    $desc = (string) $link;
    $href = (string) $link['href'];

    echo " - ";
    if ($desc && $desc != $href) {
        echo "$desc: ";
    } 
    echo "$href\n";
}
1
katma

Chrome kullanıyorsanız, XPath sorgularınızı konsolda test edebilirsiniz, şöyle:

$x("//*[contains(@class, 'tablesortcolumn')]")
0
katma
Bu cevap, XPath ifadelerini test etmenin bir yolunu açıklar, ancak soruyu cevaplamaz. Bu arada: ayrıca Firefox'ta da çalışıyor.
katma yazar Mathias Müller, kaynak
Bunu bilmiyordum. Bahşiş için teşekkürler :)
katma yazar Vince, kaynak
Biliyorum ama bu bir ipucu ... Vince bunu yapmak için iyi bir yöntem kullanıyor, sadece doğru sorguya ihtiyacı var.
katma yazar Dr. Z, kaynak