在PHP中存储兄弟元素的属性和内部html

时间:2018-06-09 09:25:15

标签: php html

我试图从html页面搜索和存储值,因此我有一个简单的数组数组。它只有2个数组,每个数组长3个。我这样定义它;这些只是标题:

$fileContents = array(
    array('Date', 'Title', 'Link')
);

html具有以下结构:

<li class='my-list'>
    <div class='my-meta'>
        <span class='my-date'>06/08/2018</span>
    </div>
    <a href='https://www.example.com/'>My Title </a>

这种结构重复了几次。我只需要从顶部开始的第一个(最新的一个)。我可以看到我需要的所有信息或我的数组都在那里。 Date06/08/2018TitleMy TitleLinkwww.example.com/。但我不知道如何访问它们;特别是Title和Link,因为这些元素上没有类。为了进一步澄清,我希望这是最终结果(它是一个csv):

Date, Title, Link
06/08/2018, My Title, https://www.example.com/

目前我正在使用以下方法。我知道如何获得的唯一一个是日期:

$dateClassName="my-date";

$xpath = new DomXpath($doc);
$dateList = $xpath->query("//span[contains(@class, '$dateClassName')]");
$dateNode = $dateList->item(0);

function innerHTML($node) {
    return implode(array_map([$node->ownerDocument, "saveHTML"],
            iterator_to_array($node->childNodes)));
}

$textArray = array();
array_push($textArray, innerHTML($dateNode));

其余项目(链接和标题)我不确定如何存储,因为元素上没有类。

问题:鉴于我上面的现有方法,如果相关元素没有可供搜索的公开类,我还可以从HTML中存储我需要的值?我可以凭借他们相对的兄弟姐妹的位置以某种方式获得他们吗?

1 个答案:

答案 0 :(得分:1)

这是一个简单的代码,可以满足您的所有需求:

$s = "<ul>
    <li class='my-list'>
        <div class='my-meta'>
            <span class='my-date'>06/08/2018</span>
        </div>
        <a href='https://www.example.com/'>My Title </a>
    </li>
    <li class='my-list'>
        <div class='my-meta'>
            <span class='my-date'>06/08/2017</span>
        </div>
        <a href='https://www.example.com/2'>My Title2 </a>
    </li>
</ul>";

$doc = new DOMDocument();
$doc->loadHTML($s);
$xpath = new DomXpath($doc);
$li = $xpath->query("//li");
$li = $li->item(0);
var_dump($li->getElementsByTagName('a')[0]->getAttribute('href'));
var_dump($li->getElementsByTagName('div')[0]->getElementsByTagName('span')[0]->textContent);
var_dump($li->getElementsByTagName('a')[0]->textContent);

如您所见,您可以使用$li,因为它是DOMElement类型的对象。