尝试使用 PHP DOMDocument 从 html 页面获取值

Trying to get values from a html page with PHP DOMDocument

我可以通过内部网 URL 访问一个网页,但我无权编辑。它包含各种 span 元素,其中包含我想捕获以在其他地方使用的文本。我想要的每个 span 元素都有一个唯一的 id,所以我想使用这个 id 来识别和捕获我想要的文本。我',尝试使用 PHP 的 Domdocument 来执行此操作。

这是 url 中 html 的示例。

<td class="style12">
  <div id="upINMain">
    <span id="car7">90</span>
  </div>
</td>

注意:如果我在浏览器中访问 url,我可以看到它是一个完整的 HTML 文档,上面只是一个片段。

这是我试图用来获取各种值的一些 PHP 代码。

// scrape the page to pull data.
                    $page = file_get_contents([full url I have pulled from database here including http bit etc]);
                    $doc = new DOMDocument();

                    $doc->validateOnParse = true;
                    $doc->preserveWhiteSpace = false;
                    $doc->loadHTML($page);

                    // define id attributes
                    foreach($doc->getElementsByTagName('span') as $element)     {
                            $element->setIdAttribute('id',true);
                                                                                                                                    }
                    // now work out from the table which ids we need to scrape and how many.

                            $Column1Name = $ReadIDMapsRow['column1_name'];
                            $Column1Value = $doc->getElementById($ReadIDMapsRow['column1_id']);
                            $Column1ValueText =  $Column1Value->textContent;

(在上面的代码中,$ReadIDMapsRow['column1_id'] 包含了我要捕获的元素的id,一个字符串'car7'。)

但是当我查看输出页面上的 get_defined_vars() 调试打印输出时,我将所有这些都放入其中,我可以看到 var $Column1ValueText 是空的。 (和其他人一样,我也一样)

    [Column1Name] => CAR
    [Column1Value] => 
    [Column1ValueText] => 

可能相关的是,我还注意到,当我查看我的调试时,我可以看到 $doc 调试信息显示

    [doc] => DOMDocument Object
        (
            [doctype] => (object value omitted)  <- this is a lie, it does have a doc type!
            [implementation] => (object value omitted)
            [documentElement] => (object value omitted)
            [actualEncoding] => 
            [encoding] => 
            [xmlEncoding] => 
            [standalone] => 1

但是如果我检查 Chrome 中的页面,它确实在顶部有一个 doc 类型声明,并且不仅仅是 Chrome 慷慨地添加它,因为我可以在$page var 在我的调试中也是:

 [page] => 

<!DOCTYPE html>
...

为 Nigel 编辑:用于捕获我想要的不同值的实际代码块如下所示。

// define id attributes
foreach($doc->getElementsByTagName('span') as $element)     {
        $element->setIdAttribute('id',true);
                                                                                                                }
// now work out from the table which ids we need to scrape and how many.
if (!empty($ReadIDMapsRow['column1_name']))     {
        $Column1Name = $ReadIDMapsRow['column1_name'];
        $Column1Value = $doc->getElementById($ReadIDMapsRow['column1_id']);
        $Column1ValueText =  $Column1Value->textContent;
                                                                                        }
if (!empty($ReadIDMapsRow['column2_name']))     {
        $Column2Name = $ReadIDMapsRow['column2_name'];
        $Column2Value = $doc->getElementById($ReadIDMapsRow['column2_id']);
        $Column2ValueText =  $Column2Value->textContent;
                                                                                        }
if (!empty($ReadIDMapsRow['column3_name']))     {
    $Column3Name = $ReadIDMapsRow['column3_name'];
    $Column3Value = $doc->getElementById($ReadIDMapsRow['column3_id']);
    $Column3ValueText =  $Column3Value->textContent;
                                                                                    }
etc... 10 of these blocks of code in total. 

它从数据库中的一行中提取,其目的是查看该行来决定 URL 以及要在 html 页面上查找多少个元素 ID 以及它们的 ID是。 (这个想法是我可以编辑或添加一行到这个 table 让它从不同的页面寻找不同的东西。

到目前为止,这就是我根据您的代码所做的工作...

$doc = new DOMDocument();

$doc->validateOnParse = true;
$doc->preserveWhiteSpace = false;
$doc->loadHTML($page);

$ReadIDMapsRow = ['column1_name' => 'CAR', 'column1_id' => 'car7'];

$Column1Name = $ReadIDMapsRow['column1_name'];
$Column1Value = $doc->getElementById($ReadIDMapsRow['column1_id']);
$Column1ValueText =  $Column1Value->textContent;

echo $Column1Name.PHP_EOL;
echo $Column1ValueText.PHP_EOL;

给出...

CAR
90