提问人:Jibeji 提问时间:4/4/2023 更新时间:4/5/2023 访问量:68
PHP / DOM : 解析 HTML 以根据类提取数据
PHP / DOM : parse HTML to extract data based on class
问:
我有这个HTML
<div class="news">
<h3 class="border-bottom">Title 2</h3>
<p class="mt-0 ml-1">2023-04-01</p>
<img src="20230401.jpg" class="w-50 float-right ml-2">
<p class="lead"><p>Description 2</p></p>
<a href="https://.../news/245" class="btn btn-secondary">Read more</a>
</div>
<div class="news">
<h3 class="border-bottom">Title 1</h3>
<p class="mt-0 ml-1">2023-03-31</p>
<img src="20230331.jpg" class="w-50 float-right ml-2">
<p class="lead"><p>Description 1</p></p>
<a href="https://.../news/244" class="btn btn-secondary">Read more</a>
</div>
我想提取每个项目的标题和日期。我试过这个
$class = "news";
$dom = new DOMDocument();
$dom->loadHTML($html);
$a = new DOMXPath($dom);
$divs = $a->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $class ')]");
foreach ($divs as $link) {
print_r($link->nodeValue);
}
但它表明:
标题 2
2023-04-01
描述 2
阅读更多
标题 1
2023-03-31
描述 1
阅读更多
我被卡住了,不知道如何提取它
答:
1赞
Jack Fleeting
4/4/2023
#1
首先,您的示例无效(它包含嵌套的 s)。假设你解决了这个问题,我会尝试这样的事情:<p>
$qu = "//div[contains(@class,'{$class}')]";
$divs = $a->query($qu);
foreach ($divs as $div)
{
$targets = $a->query('.//h3 | p[1]',$div);
echo($targets[0]->textContent ." ".$targets[1]->textContent."\r\n");
};
输出,基于固定的示例 html:
Title 2 2023-04-01
Title 1 2023-03-31
编辑:
为了获取链接,应将 for 循环更改为:
{
$targets = $a->query('.//h3 | p[1] | a/@href',$div);
echo($targets[0]->textContent ." ".$targets[1]->textContent." ".$targets[2]->textContent."\r\n");
};
输出现在应为:
Title 2 2023-04-01 https://.../news/245
Title 1 2023-03-31 https://.../news/244
评论
0赞
Jibeji
4/5/2023
谢谢!如果我想检索链接?a->textContent 提供“阅读更多”,但不提供链接
0赞
Jack Fleeting
4/5/2023
@Jibeji 事实上,您现在正在尝试检索属性值,而不是节点的文本内容。语法不同。请参阅编辑以获取更新。
评论