【问题标题】:Parsing HTML Table based on nearby header tag using DOMDocument and DOMXPath使用 DOMDocument 和 DOMXPath 基于附近的标题标签解析 HTML 表
【发布时间】:2015-12-15 11:36:43
【问题描述】:

我有一个简单的 PHP 应用程序,它可以解析 html 内容并从 td 中提取与特定查询匹配的数据。

HTML 代码:

<html>
    <h3>HELLO WORLD</h3>
    <table>
         <tr><td>A</td><td>A2</td></tr>
         <tr><td>B</td><td>B2</td></tr>
         ...
         ...
    </table>
    <h3>HELLO AMERICA</h3>
    <table>
         <tr><td>A</td><td>A3</td></tr>
         <tr><td>C</td><td>C2</td></tr>
         ...
         ...
    </table>
    <h3>HELLO TEXAS</h3>
    <table>
         <tr><td>D</td><td>D2</td></tr>
         <tr><td>E</td><td>E2</td></tr>
         ...
         ...
    </table>
<html>  

解析表格的PHP代码

$content = file_get_contents($html_string);
$dom = new DOMDocument();
@$dom->loadHTML($content);
$xpath = new DOMXPath($dom);
$query = "//tr/td[position()=1 and normalize-space(text()) = '".$q."']";
$entries = $xpath->query($query);

$entryCount = $entries->length;

if ($entryCount==1){
    $entry = $entries->item(0);
    $tr = $entry->parentNode;
    foreach ($tr->getElementsByTagName("td") as $td) {
        $fieldnames[] = $td->textContent;
    }

//Return data set
    $data[] = $fieldnames;
    return $data;
}

else {
    $data = array();

    for ($i=0;$i<$entryCount;$i++){
        $fieldnames = [];
        $entry = $entries->item($i);
        $tr = $entry->parentNode;
        foreach ($tr->getElementsByTagName("td") as $td) {
            $fieldnames[] = $td->textContent;
        }
        $data[] = $fieldnames;
    }

    return $data;
}

基本上这将遍历所有 3 个表。比如说,我发送一个查询($q = A),它会返回:

$data[0][0] => A, $data[0][1] => A2
$data[1][0] => A, $data[1][1] => A3

但是,我只想要第一个表(A 和 A2)中的数据。桌子是“裸露的”。没有身份证,没有班级或任何身份证明。唯一能识别它们的是 h3 标签。假设我提供了一个查询,指定 h3 ($q2 = HELLO WORLD),是否可以仅从第一个表中提取数据?

【问题讨论】:

    标签: php dom html-parsing domdocument domxpath


    【解决方案1】:

    您想使用前面的兄弟轴和[1] 位置谓词(或任何正式名称),并查看h3 元素的文本内容以找到h3 元素中的哪一个是正确的在你想要的table之前;所以,我想,这个:

    //table[preceding-sibling::h3[1][. = "HELLO WORLD"]]
    

    或者,要获取示例中的代码正在寻找的特定内容,

    //table[preceding-sibling::h3[1][. = "HELLO WORLD"]]/tr/td[position()=1 and normalize-space(text()) = '".$q."']
    

    如果您后来碰巧想要获取其他表格,只需换掉该表达式中的文本即可;例如,以下内容将只是您示例中的最后一个。

    //table[preceding-sibling::h3[1][. = "HELLO TEXAS"]]
    

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2015-10-04
      相关资源
      最近更新 更多