尝试使用 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
我可以通过内部网 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