【问题标题】:Using Xpath with PHP to parse HTML使用 Xpath 和 PHP 来解析 HTML
【发布时间】:2012-12-05 07:47:08
【问题描述】:

我目前正在尝试解析来自论坛的一些数据。代码如下:

$xml = simplexml_load_file('https://forums.eveonline.com');

$names = $xml->xpath("html/body/div/div/form/div/div/div/div/div[*]/div/div/table//tr/td[@class='topicViews']");
foreach($names as $name) 
{
    echo $name . "<br/>";
}

无论如何,问题是我正在使用 google xpath 扩展来帮助我获取路径,我猜 google 正在更改 html 足以使其在我使用我的网站进行搜索时不会出现.有什么方法可以让主持人通过谷歌浏览器查看网站,以便获得正确的代码?你有什么建议?

谢谢!

【问题讨论】:

  • 您是否尝试在您的网络浏览器中禁用 Javascript?您的 PHP 不会使用它,因此网站上的 javascript 所做的任何更改都不会出现在服务器上。
  • XPath 用于 XML,而不用于 HTML。
  • JS 没有在我正在运行的页面上运行。我知道 XPath 用于 XML,但从我通过 Google 搜索看到的情况来看,它也很流行用于 HTML。

标签: php xpath


【解决方案1】:

我的建议是始终使用DOMDocument 而不是 SimpleXML,因为它是一个更好的界面,并且使任务更加直观。

以下示例向您展示如何将 HTML 加载到 DOMDocument 对象中并使用 XPath 查询 DOM。您真正需要做的就是找到类名为 topicViews 的所有 td 元素,这将输出在此 XPath 查询返回的 DOMNodeList。

/* Use internal libxml errors -- turn on in production, off for debugging */
libxml_use_internal_errors(true);
/* Createa a new DomDocument object */
$dom = new DomDocument;
/* Load the HTML */
$dom->loadHTMLFile("https://forums.eveonline.com");
/* Create a new XPath object */
$xpath = new DomXPath($dom);
/* Query all <td> nodes containing specified class name */
$nodes = $xpath->query("//td[@class='topicViews']");
/* Set HTTP response header to plain text for debugging output */
header("Content-type: text/plain");
/* Traverse the DOMNodeList object to output each DomNode's nodeValue */
foreach ($nodes as $i => $node) {
    echo "Node($i): ", $node->nodeValue, "\n";
}

【讨论】:

    【解决方案2】:

    双 '/' 将进行 xpath 搜索。因此,如果您使用 xpath '//table',您将获得所有表格。 您还可以在您的 xpath 结构中更深入地使用它,例如 'html/body/div/div/form//table' 来获取 xpath 'html/body/div/div/form' 下的所有表。

    通过这种方式,您可以使您的代码对 html 源代码的更改更具弹性。

    如果您想使用 xpath,我确实建议您学习一些有关它的知识。复制粘贴只能帮到你。

    关于语法的简单解释可以在 w3schools.com/xml/xpath_syntax.asp 找到

    【讨论】:

    • 如何获取整个 HTML 标签(匹配)标签,我不需要它像数组。在我的情况下,我使用 XPath 作为“//math”来选择 html 中的所有数学标记,稍后我必须使用图像进行更改
    猜你喜欢
    • 2011-06-03
    • 2012-07-19
    • 2012-08-23
    • 2014-07-13
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多