繁体   English   中英

使用DOMDocument和DOMXPath基于附近的标头标签解析HTML表

[英]Parsing HTML Table based on nearby header tag using DOMDocument and DOMXPath

我有一个简单的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)中的数据。 桌子是“裸体的”。 没有ID,没有类别或任何标识。 唯一可以识别它们的是h3标签。 假设我提供一个指定h3的查询($ q2 = HELLO WORLD),是否可以仅从第一个表提取数据?

您想使用前一个同级轴和[1]位置谓词(或正式使用的谓词),然后查看h3元素的文本内容,以查找与您想要的table h3的那个h3元素。 因此,我认为:

//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"]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM