2017-06-10 12 views
0

PHPのWebスクラップングをうまくしようとしています。いくつかのテストをして、あるサイトから別のサイトにその情報をスクラップしたりエコーしたりしましたが、元のリンクをソースコードに含めることができません。これは理想的です。私が持っているものでこれを達成する方法についてのどんな考えも、これまでに見ていますか? (私は非常にpht btwに新しいです)。xpathテキストに含まれる任意のhrefリンクを含むPHP

これはPHPのコードです:

// news 
$doc = new DOMDocument; 

// We don't want to bother with white spaces 
$doc->preserveWhiteSpace = false; 

// Most HTML Developers are chimps and produce invalid markup... 
$doc->strictErrorChecking = false; 
$doc->recover = true; 

$doc->loadHTMLFile('https://www.usatoday.com/'); 

$xpath = new DOMXPath($doc); 

$query = "//ul[@class='hfwmm-list hfwmm-4uphp-list hfwmm-light-list']"; 

$entries = $xpath->query($query); 
foreach ($entries as $entry) { 
echo trim($entry->textContent); // use `trim` to eliminate spaces 
} 

そのコードがこれを吐き出している:NBA CAVSはアーヴィングの40のエンターテインこの時計の後ろに記録破りのゲーム4に勝つ:「ブラックパンサー」のトレーラーが恐ろしい王ニュース警察を最大限に引き出します:ロンドン橋のテロリストはもっと血を流すように計画されています..........

私は本当にやりたいことは、実際には働いているリンク元のコードで。これが、この情報のソースコードは次のように見えたものです:正気のために

<div class="partner-heroflip-ad partner-placement ui-flip-panel size-xxs"><a 
href="#" class="partner-close"></a></div></div><p class="hfwmm-tertiary- 
list-title hfwmm-light-tertiary-list-title">TOP STORIES</p><ul class="hfwmm- 
list hfwmm-4uphp-list hfwmm-light-list" 
data-track-prefix="flex4uphphero"><li class="hfwmm-item hfwmm-secondary-item 
hfwmm-item-2 sports-theme-bg hfwmm-first-secondary-item hfwmm-4uphp- 
secondary-item" 
data-asset-position="1" 
data-asset-id="102694848" 
><a class="js-asset-link hfwmm-list-link hfwmm-light-list-link hfwmm-image- 
link hfwmm-secondary-link 
href="/story/sports/nba/2017/06/10/kyrie-irving-lebron-james-cavs-win-game- 
4/102694848/" 
data-track-display-type="thumb" 
data-ht="flex4uphpherostack1" 
data-asset-id="102694848"     
><span class="hfwmm-image-gradient hfwmm-secondary-image-gradient"></span> 
<span class="js-asset-section theme-bg-ssts-label hfwmm-ssts-label-top-left 
hfwmm-ssts-label-secondary sports-theme-bg">NBA</span><img 
src="https://www.gannett-cdn.com/- 
mm-/cd17823b265aa373c83094fc75525710f645ec90/c=0-178-4072- 
81338209183-USP-NBA-FINALS-GOLDEN-STATE-WARRIORS-AT-CLEVELAND-91573076.JPG" 
class="hfwmm-image hfwmm-secondary-image js-asset-image placeholder-hide" 
    alt="Kyrie Irving reacts after making a basket against the" 
    data-id="102695338" 
    data-crop="16_9" 
    width="239" 
    height="135" /><span class="hfwmm-secondary-hed-wrap hfwmm-secondary-text- 
hed-wrap"><span class="hfwmm-text-hed-icon js-asset-disposable"></span><span 
    title="Cavs win record-breaking Game 4 behind Irving&#39;s 40" 
    class="js-asset-headline hfwmm-list-hed hfwmm-secondary-hed placeholder- 
hide"> 
     Cavs win record-breaking Game 4 behind Irving&#39;s 40 
    hfwmm-item-3 life-theme-bg hfwmm-4uphp-secondary-item" 
    data-asset-position="2" 

、上記のhrefはhrefのある= "/物語/スポーツ/ NBA/2017/6月10日/キリエアーヴィング - レブロン・james- cavs-win-game- 4/102694848/"

このテストシナリオでこれがどのように達成されるかについてのご意見は、大変参考になります。どうもありがとうございました。 -wilson

答えて

1

要素を文字列として出力する必要があります(XMLと同じものではありません)。要素は<a>some text</a>であり、テキストは単にsome textです。出力タグ、使用することを

...

$query = "//ul[@class='hfwmm-list hfwmm-4uphp-list hfwmm-light-list']//a"; 

$entries = $xpath->query($query); 
foreach ($entries as $entry) { 
    $newdoc = new DOMDocument(); 
    $cloned = $entry->cloneNode(TRUE); 
    $newdoc->appendChild($newdoc->importNode($cloned,TRUE)); 
    echo $newdoc->saveHTML(); 
    //echo trim((string)$entry); // use `trim` to eliminate spaces 
} 

はまた、私はあなたがフェッチセグメント内のリンクに選択を制限するために、XPath式の最後に//追加したことに注意してください。これは、あなたが望むものかもしれませんが、結果を見てチェックしてください。

編集:

のhrefを操作するために、そしてちょっとナイジェル何かのような...

foreach ($entries as $entry) { 
    $oldHref = (string)$entry->getAttribute("href"); 
    $entry->setAttribute("href", "http://someserver.com".$oldHref); 
    $newdoc = new DOMDocument(); 
    $cloned = $entry->cloneNode(TRUE); 
    $newdoc->appendChild($newdoc->importNode($cloned,TRUE)); 
    echo $newdoc->saveHTML(); 
} 
+0

を使用し、そのためのおかげでそんなに!スーパーヘルプ!それらをリンクとして表示します。私はあなたが変更する方法を知っているかと思いますが、かなり理想的ではない2つの事柄。リンクは実際には正しい参照には向いていませんが、実際にはどこにも実際には行きません。 2つ目のことは、実際にリンクの隣に表示される画像が現実的ではないことです。しかしもう一度ありがとう。 – Masteryogurt

+0

@Masteryogurtこのタグには、hrefだけが必要な場合は、あらゆる種類の余分なものが含まれています。そして、XPathを '$ query =" // ul [@ class = 'hfwmm-list hfwmm-4uphp-list hfwmm-light-list '] // a/@ href ";'そしてあなたのループは 'echo trim($ entry-> value)'を使用します" \ n ";' –

+0

ナイジェルは、最初に提供したコードは、リンクが機能します。問題は自分のサーバーがそのWebサイトのルート参照を表示していないことです。言い換えれば、リンクは私を_____ /物語/ 12538に連れて行っています。同様に壊れたリンクとして表示されます。私のサーバーがrootとしてusatoday.comになっていたら、そのリンクが機能します。私は別のルートサーバーを持っている場合、そのリンクを動作させるにはどうすればいいですか?それの前にusatoday.comを注入するようなカスタム方法?興味深い状況。 – Masteryogurt

関連する問題