【问题标题】:How do I filter my results ? Html Dom Parser如何过滤我的结果? Html Dom 解析器
【发布时间】:2017-12-14 15:56:43
【问题描述】:

我得到以下代码:

<?php
    include('simple_html_dom.php');
    $html = file_get_html('http://www.google.com/search?q=BA236',false);
    $e = $html->find("div[class=g]");
echo $e[0]->innertext;
?>

当我运行它时,我会得到第一类 google 搜索结果,即:

British Airways Flight 236

Scheduled   departs in 13 hours 13 mins

Departure   DME 5:40 AM     —

Moscow  Dec 15

Arrival LHR 6:55 AM     Terminal 5

London  Dec 15

Scheduled   departs in 1 day 13 hours

Departure   DME 5:40 AM     —

Moscow  Dec 16

Arrival LHR 6:55 AM     Terminal 5

London  Dec 16

我的问题是我不需要所有这些信息,而且我不知道如何过滤此回显,因为 Html 代码没有 id´s 或类。 我想用 jquery 或简单的 css 隐藏我不需要的 html,但是:同样的问题,我没有 id´s 或类来调用它们。

那么我怎样才能过滤掉我不想要的信息。 请给我一个例子,我会检查我需要删除自己的 html。谢谢。

【问题讨论】:

  • 你还没有解释你真正想把它减少到什么信息。
  • 只是减少一些东西,所以我理解这个过程。谢谢

标签: php html parsing dom screen-scraping


【解决方案1】:

您正在搜索的内容称为grep 工具(或正则表达式)。 有关可能的答案,请参阅 SO 网站的 PHP to search within txt file and echo the whole line。对您的应用稍作修改:

$contents = 'British Airways Flight 236\n\nScheduled   departs in 13 hours 13 mins\n\nDeparture   DME 5:40 AM     —\n\Moscow  Dec 15\n\n...'

$searchfor = 'departs';

$pattern = preg_quote($searchfor, '/');
// finalise the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";
// search, and store all matching occurences in $matches
if (preg_match_all($pattern, $contents, $matches)) {
   echo "Found matches:\n";
   echo implode("\n", $matches[0]);
} else {
   echo "No matches found";
}

编辑:

或者,如评论中所述,使用 -&gt;saveHTML 而不是 -&gt;innertext 来保留 HTML 结构以便于解析。

【讨论】:

  • 感谢您的回答,但我需要通用的东西,因为我希望航班号能够更改。如果航班号更改,则文本更改...
  • 也许像选择这个和这个信息,不要碰其他信息什么的,我不知道,也许我应该只在不同的回声中找到我需要的元素。但同样的问题,如果一个元素的名称与其他 100 个元素相同,我该如何选择?
  • $searchfor 是一个变量,正则表达式与您自己解析它一样灵活。我只是将$contents$searchfor 设置为固定值以进行演示。例如,您不妨从机场列表中搜索目的地名称。
  • -&gt;innertext 可能是这里的实际问题,因为它丢弃了 html 结构。您可能想改用-&gt;saveHTML
  • 所以即使每次更改 googlerequest/flightnumer 时 90% 的 innerhtml 都会发生变化,我也可以使用 $searchfor ?