2017-01-12 109 views
-1

我想从第一个笑话都<p>要素所以基本上我做了这个脚本:PHP从网站提取数据

<?php 
$url = "http://sms.hindijokes.co"; 
$html = file_get_contents($url); 
$doc = new DOMDocument; 
$doc->strictErrorChecking = false; 
$doc->recover = true; 
@$doc->loadHTML("<html><body>".$html." 
</body>  </html>"); 
$xpath = new DOMXPath($doc); 
$query1 = "//h2[@class='entry-title']/a"; 
$query2 = "//div[@class='entry-content']/p"; 
$entries1 = $xpath->query($query1); 
$entries2 = $xpath->query($query2); 
$var1 = $entries1->item(0)->textContent; 
$var2 = $entries2->item(0)->textContent; 
echo "$var1"; 
echo "<br>"; 
$f = 5; 
for($i = 0; $i < $f; $i++){ 
echo $entries2->item($i)->textContent."\n"; 
} 
?> 

这一次我知道,有在第一个笑话,但如果有五个<p>元素我希望它是自动化的脚本,有时会多于或少于五个元素,因此会造成混乱。

+0

请参阅http://stackoverflow.com/questions/6366351/getting-dom-elements-by-classname –

回答

0

您需要先div唯一p元素,让您的查询将是:

$entries2 = $xpath->query('//(div[@class='entry-content'])[1]/p'); 

现在,您可以用迭代循环foreach()所有p元素(提取它的HTML内容):

$innerHtml = ''; 
foreach ($entries2 as $entry) { 
    $children = $entry->childNodes; 
    foreach ($children as $child) { 
     $innerHtml .= $child->ownerDocument->saveXML($child); 
    } 
} 
$innerHtml = str_replace(["\r\n", "\r", "\n", "\t"], '', $innerHtml); 
+0

如何获得HTML内容太..像p元素是这样的(不少于大于) –

+0

我如何从p元素包含html内容?因为他们是
需要包括... –

+0

@AliveColdJuan检查我编辑的答案,如果它提取内部html内容。它基于我的旧代码,现在我不确定它是否按我预期的那样工作。 – shudder

0

DOMXPath::query返回DOMNodeList对象。使用DOMNodeList::length属性。

$f = $entries2->length; 
+0

我怎么能包括BR你能帮我自己的一些
在p标签 –

0

试试这种方式,它返回到null;但一些笑话有多个p标签,以便其更好地为您通过您的自定义找到它class/id

$i = 0; 
while($entries2->item($i)->textContent!=NULL) { 
    echo "<br>"; 
    echo $i." ".$entries2->item($i)->textContent; 
    $i++; 
}