提取DIV块的内容。 Div块中还有更多块。我想检索一些信息。有几个Div块。最好能进入foreach循环。
$dom_document = new DOMDocument();
libxml_use_internal_errors(true);
$dom_document->loadHTML($html);
libxml_clear_errors();
$dom_document->preserveWhiteSpace = false;
//use DOMXpath to navigate the html with the DOM
$xpath = new DOMXpath($dom_document);
$items = $xpath->query('//div[contains(@class,"card")]');
foreach ($items as $item) {
$title = $xpath->xpath('.//div[@class="card-header"]/div/a[@class="text-number"]');
}
echo $title;
Der HTML代码dazu:
<div class="row">
<div class="col-xl-4 col-lg-6 col-md-6 col-smr-2 my-12 col-xs-12 mt-2 mb-3">
<div class="card">
<div class="card-header">
<div class="d-flex mb-2"><a class="text-number" href="/read/3325" id="3325">NUMBER</a>
</div>
</div>
<div class="d-flex">
<h5><a class="mr-auto" href="LINK" target="_blank">TITLE</a>
</h5>
</div>
<div class="d-flex"> <strong class="mr-2">AUTOR</strong><span class="mr-2">RANDOM-NUMBER</span>
<time class="text-muted mr-2" datetime="2019-04-26T01:20:28.000Z">TIME</time>
</div>
</div>
<div class="card-body">
<div class="card-text">CONTENT</div>
</div>
</div>
</div>
<div class="col-xl-4 col-lg-6 col-md-6 col-smr-2 my-12 col-xs-12 mt-2 mb-3">
<div class="card">
<div class="card-header">
<div class="d-flex mb-2"><a class="text-number" href="/read/3325" id="3325">NUMBER</a>
</div>
</div>
<div class="d-flex">
<h5><a class="mr-auto" href="LINK" target="_blank">TITLE</a>
</h5>
</div>
<div class="d-flex"> <strong class="mr-2">AUTOR</strong><span class="mr-2">RANDOM-NUMBER</span>
<time class="text-muted mr-2" datetime="2019-04-26T01:20:28.000Z">TIME</time>
</div>
</div>
<div class="card-body">
<div class="card-text">CONTENT</div>
</div>
</div>
</div>
<div class="col-xl-4 col-lg-6 col-md-6 col-smr-2 my-12 col-xs-12 mt-2 mb-3">
<div class="card">
<div class="card-header">
<div class="d-flex mb-2"><a class="text-number" href="/read/3325" id="3325">NUMBER</a>
</div>
</div>
<div class="d-flex">
<h5><a class="mr-auto" href="LINK" target="_blank">TITLE</a>
</h5>
</div>
<div class="d-flex"> <strong class="mr-2">AUTOR</strong><span class="mr-2">RANDOM-NUMBER</span>
<time class="text-muted mr-2" datetime="2019-04-26T01:20:28.000Z">TIME</time>
</div>
</div>
<div class="card-body">
<div class="card-text">CONTENT</div>
</div>
</div>
</div>
</div>
我需要以下信息 -NUMBER -链接 -标题 -自动 -RANDOM-NUMBER - 时间 -内容
非常感谢您的帮助。如果有人知道,那就太好了。
答案 0 :(得分:1)
在这种情况下,必须从您获得的每个$item
内的XML中选择单个元素。
使用DOMDocument,更容易坚持使用XPath表达式,但是使用descendant::
来确保搜索到的节点在指定为evaluate()
的第三个参数的start元素内。每个点都需要一个字符串值-我使用了evaluate('string(...))
,因为它会返回一个字符串,而query()
将返回一个DOMNodeList,然后您需要对其进行处理。
我希望以上所述的XPath有意义,唯一奇怪的是CONTENT。因为这是下一个节点(而不是子节点),所以我使用following-sibling::
来访问它。
$items = $xpath->query('//div[@class="card"]');
foreach ($items as $item) {
$title = $xpath->evaluate('string(descendant::*//a[@class="text-number"])', $item);
$link = $xpath->evaluate('string(descendant::div[@class="d-flex"][1]/h5/a/@href)', $item);
$title = $xpath->evaluate('string(descendant::div[@class="d-flex"][1]/h5/a)', $item);
$autor = $xpath->evaluate('string(descendant::div[@class="d-flex"][2]/strong)', $item);
$randomNumber = $xpath->evaluate('string(descendant::div[@class="d-flex"][2]/span)', $item);
$time = $xpath->evaluate('string(descendant::div[@class="d-flex"][2]/time)', $item);
$content = $xpath->evaluate('string(following-sibling::*//div[@class="card-text"])', $item);
echo $title."/".$link."/".$title."/".$autor."/".$randomNumber.
"/".$time."/".$content.PHP_EOL;
}
有关descendant::
和following-sibling::
之类的更多信息,它们是谈论here的XPath轴。