PHP - 使用SimpleXMLElement解析网页

时间:2017-07-27 23:41:56

标签: php xml simplexml

我有这个网页我试图使用SimpleXMLElement来解析#href"#3"然后得到以下span-> a的内容,这将是" jim":

<?xml version='1.0'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>..</head>
    <title>this is the title<title>
    <body>
      <script>...</script>
      <div id="div1">
        something
      </div>
      <div id="content">
        <div id="src">
            <pre>
                <a name="1" href="#1">1</a>
                <span class="myclass">
                    <a href="somelink123">john</a>
                </span>
                <a name="1" href="#2">2</a>
                <span class="myclass">
                    <a href="somelink2342">dev</a>
                </span>
                <a name="1" href="#3">3</a>
                <span class="myclass">
                    <a href="somelink33452">jim</a>
                </span>
                ....
                ....
            </pre>
        </div>
      </div>
   </body>
</html>

我正在使用SimpleXMLElement来接触“预先”的孩子们。但是我如何根据属性和兄弟姐妹访问元素?

谢谢!

3 个答案:

答案 0 :(得分:1)

使用php DomDocument

此代码将查找a#href "#3"并找到旁边的范围。

$dom = new DOMDocument();
libxml_use_internal_errors(true);//Disable libxml errors
$dom->loadHTMLFile("test.html");//saved your html as test.html

$xpath = new DOMXPath($dom);

$spanVal = $xpath->query("//a[@href='#3']/following-sibling::*[1]");

foreach($spanVal as $span)
{
    echo $span->nodeValue;
}

输出:

jim 

答案 1 :(得分:0)

使用XPath和SimpleXML,您可以使用以下内容...

    <?php
    error_reporting ( E_ALL );
    ini_set ( 'display_errors', 1 );

    $xml = simplexml_load_file("t1.xml");

    $xml->registerXPathNamespace("d", "http://www.w3.org/1999/xhtml");
    $elements = $xml->xpath("//d:a[@href='#3']/following-sibling::d:span/d:a");
    foreach ( $elements as $element )   {
        echo $element;
    }

我已将文件保存为t1.xml(也修复了标题的结束标记 - 因此有点欺骗以使其变得简单)。

这里最重要的是有一个默认的命名空间,如果你不包含registerXPathNamespace(在这种情况下使用&#39; d&#39;作为一个虚拟前缀)那么这些元素可以&#39找不到。您可以看到我将d:放在每个元素名称的开头(即d:span

答案 2 :(得分:-1)

尝试使用simple_html_dom_parser。这很容易使用+提供了很多选择。这是一个简单的DOM版本。这是链接 -

simple_html_dom_parser

我希望这会有所帮助!