PHP / DOM : 解析 HTML 以根据类提取数据

PHP / DOM : parse HTML to extract data based on class

提问人:Jibeji 提问时间:4/4/2023 更新时间:4/5/2023 访问量:68

问:

我有这个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

阅读更多

我被卡住了,不知道如何提取它

PHP 圆顶

评论

0赞 Rob Eyre 4/4/2023
你的 XPath 表达式对我来说看起来不错(尽管您可以使用“div”而不是“*”来收紧它)。它匹配了多少个 div?
2赞 Rob Eyre 4/4/2023
请注意,nodeValue 返回该元素(包括子元素)中的所有文本内容。如果您想具体挑选标题和日期,则需要进一步查询

答:

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 事实上,您现在正在尝试检索属性值,而不是节点的文本内容。语法不同。请参阅编辑以获取更新。