如何获取 Element 的 XPath [PHP/Javascript]

这两天研究 HTML 的 DOM 需要寻找某个 Element 元素的完整 XPath 路径,由于使用的是 PHP Simple HTML DOM Parser 开源库,这个库类的使用方法几乎兼容 Javascript 的 DOM 语法并附带 DOM 选择器。虽然功能强大但是并不能直接获取 Element 的 XPath。这个怎么办呢,依稀记得 Firebug 有一个功能,选择某个元素在它的控制台可以显示 XPath。嗯,着手实践一下发现不仅可以显示而且还可以复制 XPath。

于是想,如果可以找到 Javascript 版的相关代码就一定可以改成 PHP 版本的,结果在 Google 搜索找到了…

var elt = document.getElementById('table');
var xpath = getElementXPath(elt);
alert(xpath);

// Get full XPath of an element
function getElementXPath(elt)
{
	var path = "";
	for (; elt && elt.nodeType == 1; elt = elt.parentNode)
	{
		idx = getElementIdx(elt);
		xname = elt.tagName;
		if (idx > 1) xname += "[" + idx + "]";
		path = "/" + xname + path;
	}

	return path;
}

// Get Idx of an element
function getElementIdx(elt)
{
    var count = 1;
    for (var sib = elt.previousSibling; sib ; sib = sib.previousSibling)
    {
        if(sib.nodeType == 1 && sib.tagName == elt.tagName)	count++
    }

    return count;
}

PHP 改进版:

// Use it before import PHP Simple HTML DOM Parser
$html = file_get_html('http://www.google.com/');
// find a sample element by id
$elt1 = $html->find('#footer', 0);
// find a sample element by tag name
$elt2= $html->find('div', 10);

// it will return if found it: //*[@id="footer"]
$xpath = getElementXPath($elt1);

// it will return if found it: html/body/div[10]
$xpath = getElementXPath($elt2);

function getElementXPath($elt)
{
	$path = '';
	$first = TRUE;
	for(; ($elt AND $elt->nodetype == 1); $elt = $elt->parent())
	{
		$xname = $elt->tag;
		$idx = getElementIdx($elt);

		if ($first AND isset($elt->attr['id']))
		{
			$path = '//*[@id="' . $elt->attr['id'] . '"]';
			break;
		}

		if ($idx > 1)
		{
			$xname .= '[' . $idx . ']';
		}

		$path = '/'.$xname.$path;

		$first = FALSE;
	}

	return $path;
}

function getElementIdx($elt)
{
    $count = 1;
    for($sib = $elt->prev_sibling(); $sib ; $sib = $sib->prev_sibling())
    {
        if($sib->nodetype == 1 && $sib->tag == $elt->tag)
        {
        	$count++;
        }
    }

    return $count;
}

大家同样可以把上面的代码直接 crack 到 PHP Simple HTML DOM Parser 库中。

如何让PHP在Google App Engine上运行

话说前不久 Google App Engine 支持了第二种语言 Java,占据GAE需求排行榜的 java终于支持了,如果按这样的思路执行下去,那么不久的第三个语言肯定就是 PHP了!不过貌似大家都按耐不住这份心情,对 GAE 开始了各种的尝试,不过这里不能不说 java 是一个好东西,扩展和应用非常的广泛,于是乎就有了Quercu,它是一个 java 的应用,简单的说就是 PHP in Java。利用 Jetty(一款 Java 的web服务器)+ Quercus 就能让你在未开放 PHP语言支持的 GAE 上面运行 PHP代码,甚至把 Java 的类导入到 PHP里面执行!这就是 Quercus 的魔力。同样的如果你是 Ruby 用户,可以使用 JRuby 实现执行。好吧,下面开始实践:(方法来自:Brian’s World

部署环境:Windows XP + Eclipse 3.4 + GAE for Java eclipse 3.4 plugins(如果使用官方教程无法安装,请参见另类安装教程
Continue reading

刷票脚本 PHP 版

有新版本发布,请点击这里:v0.5版本 (2009年1月13日)

新一年的又将慢慢走近,身在外地的你是否对春节买票做好了准备呢?我身处在北京,北京虽说遍地几百号的代售点也承受不了上千万的人口,回家买票确实难得要命,如果最终你没有买到票且必须要回家的话都会去买黄牛票或者在网上寻求富余的票,“喂,我想问你的票…..啊,已经卖出去了啊,哦,好谢谢…”,你是否也遇到这样的问题,是不是恨自己晚知道了,而导致别人先把票买走了,不要着急,我也怕这个情况所以写了一个脚本来帮助我完成这样的工作:刷票脚本
Continue reading