Archive for the 'SEO' Category

You are currently browsing the archives of Enabling Technology .

使用WordPress的XMLRPC功能

WordPress 内部就有XMLRPC功能,稍作修改,就可以通过XMLRPC服务达到不少高级的功能,比如两个Blogger站点内容进行同步,只要另一个支持 XMLRPC发布就行。My Donews就支持XMLRPC发布,比如我这篇文章,就是用Zoundry这个软件离线写作,然后发到网上的。

下面的代码来自http://hasin.wordpress.com/2006/07/15/using-blog-apis/

这个地方也许国内无法访问,所以把文章拷贝过来了。

Almost every standard compliant blogs support three blogging API which are “Blogger API” , “MovableType API” and “MetaWeblog API”. Among these MW (or MetaWeblog) is used more than other two. Wordpress also supporst these three sets of API. If you are interesetd how to interact with these API’s - then take a look at the following example.

First lets discover which XMLRPC methods are suported by wordpress XMLRPC server. Just execute the following script

system.multicall
system.listMethods
system.getCapabilities
demo.addTwoNumbers
demo.sayHello
pingback.extensions.getPingbacks
pingback.ping
mt.publishPost
mt.getTrackbackPings
mt.supportedTextFilters
mt.supportedMethods
mt.setPostCategories
mt.getPostCategories
mt.getRecentPostTitles
mt.getCategoryList
metaWeblog.getUsersBlogs
metaWeblog.setTemplate
metaWeblog.getTemplate
metaWeblog.deletePost
metaWeblog.newMediaObject
metaWeblog.getCategories
metaWeblog.getRecentPosts
metaWeblog.getPost
metaWeblog.editPost
metaWeblog.newPost
blogger.deletePost
blogger.editPost
blogger.newPost
blogger.setTemplate
blogger.getTemplate
blogger.getRecentPosts
blogger.getPost
blogger.getUserInfo
blogger.getUsersBlogs

so to make a new post using metaWeblog.newPost method lets take a look at the following example.

<?php
 include("xmlrpc.inc.php");
 $c = new xmlrpc_client("/wp/xmlrpc.php", "localhost", 80);

 $content['title']="XMLRPC Post";
 $content['description']="Some content posted using MetaWeblog API";
 $content['categories'] = array("frontpage");
 $x = new xmlrpcmsg("metaWeblog.newPost",
                     array(php_xmlrpc_encode("1"),
                        php_xmlrpc_encode("admin"),
                        php_xmlrpc_encode("root"),
                        php_xmlrpc_encode($content),
                        php_xmlrpc_encode("1")));

 $c->return_type = 'phpvals';
 $r =$c->send($x);
 if ($r->errno=="0")
 echo "Successfully Posted";
 else {
  echo "There are some error";
  print_r($r);
              }
?>

Posted by micas on Jul 31st 2007 | Filed in SEO | Comments (0)

在自己Windows上安装WordPress 开发/测试环境

 

参考了以下文章,为了避免网站过期,在此附上原文:

1.基本步骤

 

文章翻译自 Installing WordPress Locally Under Windows XP剑指天下 测试并校订

近几周,Denis 给大家分享了不少如何创建属于自己的 WordPress 主题,但是我们大部分用户都是在网络上的 BLOG 上来做测试,速度相对来说很慢,而且也不容易修改代码。这里给大家简单的讲一下如何在 Windows XP 系统上安装 WordPress 来做本地测试。

首先,你必须有一个基于Apache、MySQL、PHP的编程调试环境。我们推荐使用 XAMPP LITE,可以从下面的链接下载。

下载 XAMPP LITE

将 XAMPP LITE 安装好以后,打开服务器,将 Apache 和 MySql 两个服务打开。如下图所示。

xampp

下载最新版的 WordPress ZIP 文件夹,解压并存放在 C:\xampp\htdocs 目录下。

当你第一次使用 WordPress 的时候由于你并没有创建与 BLOG 相配套的数据库,所以会产生错误。我们所需要做的就是在浏览器上输入:http://localhost/phpmyadmin/。进入数据库管理界面。选择 utf8_unicode_ci 和 utf8_general_ci 作为数据库格式,数据库名可以自定义。

create-database

在网页上打开 http://localhost/wordpress/。当你第一次使用 WordPress 的时候由于你并没有创建与 BLOG 相配套的数据库,所以会产生错误,我们所要做的就是点击 create a wp-config.php file 链接,然后根据后面的步骤继续创建数据库。

untitled
创建好 CONFIG 文件以后,你可以继续输入 BLOG 的名称和自己的 EMAIL 地址,随后系统会自动为默认的 BLOG 管理员 ADMIN 分配一个初始密码。用户登录以后可以自行修改。

至此,您的 WORDPRESS 个人 BLOG 创建成功了,接下来的就是您自己体验 WORDPRESS 了。

ps:在2003系统上也通用的.

 

 

2 解决permanent link问题:

 

Windows+Apache+MySQL+PHP (WAMP)+Wordpress 架设 (2006-2-10 16:07)

Windows+Apache+MySQL+PHP (WAMP)+Wordpress 架设 (2006-2-10 16:07)
Keyword: apache php xp 安装
在参考了(
reference:http://heijin.bokee.com/2310238.html
http://www.haospoke.com/buildapache/
http://greenisland.csie.nctu.edu.tw/wp/2005/09/03/310/
)之后,简单总结一下我的安装过程遇到的问题和经验,以方便以后的参考。

主要是配置httpd.conf 和php.ini,并记住拷贝php.ini,php5ts.dll和libMySQL.dll三个文件。

软件环境:
Microsoft Windows XP
Apache 2.053 For Win32 (x86) http://www.apache.org/
MySQL 4.1.10 For Win32 (x86) http://www.mysql.com/
PHP 5.1.2 For Win32    http://www.php.net/
MySQL Administration Tool http://dev.mysql.com/get/Downloads/MySQLAdministrationSuite/mysql-administrator-1.1.2-win.msi/from/pick
phpMyAdmin  http://www.phpmyadmin.net/

把 apache + php + sql + blog 安装在 d:\website 中

一:安装 Apache并进行配置使其支持 Php
Apache有MSI和ZIP压缩包两种格式。对于网站域名,本地调试使用localhost即可。
PHP 有EXE和ZIP压缩包两种格式,我用的zip包。
– 解压缩到 d:\website\php目录
– 把d:\website\php\php.ini-dist文件,将其重命名为php.ini,并复制到c:\windows目录里
– 将d:\website\php\ 目录中的 php5ts.dll 和 libMySQL.dll两个文件复制到c:\windows\system32 目录中
– 编辑d:\website\apache2\conf\httpd.conf 文件:
– DocumentRoot “D:/website/htdocs”;
– DirectoryIndex index.html index.html.var index.htm index.php 加上 index.htm index.php
– 模块化安装Php  
  找到 #LoadModule ssl_module modules/mod_ssl.so 这行,在此行后增加一行:
  LoadModule php5_module d:/website/php/php5apache2.dll
  找到 AddType application/x-gzip .gz .tgz,在此行后增加一行:
  AddType application/x-httpd-php .php
– 测试php
<html><head><title>hello</title></head><body><?php echo “hello,php”; ?></body></html>

二:安装并配置 MySQL
MySQL有EXE和ZIP压缩包两种格式,我用的是exe准备在试下zip,如果好用,就不用安装了,直接拷贝就行了。
– 就是當你完成安裝之後,它會問你是不是要進行 MySQL 的設定,當你選要而且選了詳細(detail)設定,Service Instance Configuration這個步驟時,選中間這項來設定預設的為 UTF8以支持多國語言.用utf-8编码的好处就是:当火星人在你blog留言,也不会出现乱码~~~
–配置 php.ini 并测试 MySQL
  用文本编辑软件打开 c:\windows\php.ini 文件,然后修改以下内容:
  将 extension_dir = “./” 改为 extension_dir = “d:/website/php/ext”
  将 ;extension=php_MySQL.dll 行首的’;’去掉;
  将 ;extension=php_mbstring.dll 行首的“;”去掉;
  将 ;session.save_path=”/tmp”改为session.save_path=”D:/website/php/session_temp”;
–重新启动 Apache 服务测试。
<?php $link=MySQL_connect(’localhost’,’root’,’lili613′); if(!$link) echo “Error !”; else echo “Ok!”; MySQL_close(); ?>
–这一步需要设置防火墙:
Note open the port of firewall, When setting up SQL using MySQL Administrator:
Firewall (Mine:Trend Micro)->Network Security->Personal Firewall->add TCP in/out Port 3306

三、使用MySQL Administration Tool 为wordpress创建一个新的数据库
對資料庫一點都不熟悉,建議多裝一個 MySQL Administration Tool,或是像 phpMyAdmin 之類的東西。
–MySQL 的 Administration Tool 先用 root 連進去->在 Startup Variables->Security 裡面勾選 Use old passwords,然後再把 MySQL 重跑一次
–並開立一個新的 database 叫做 “wordpress”,然後把這個新建的 db 的權限(insert, update, select, alter, delete, create,drop)設定給這個使用者。
方法就是click catalogs->right click schemata plane(Mysql take schemata as database)->creat new schemata->ok
也可以通过命令行实现如七所示。
–创建数据库wordpress 这一步可以使用phpMyAdmin来完成,也可以从命令行完成。
–为了更好地支持中文,在chenwu/wp-includes/wp-db.php文件的第56行增加如下内容: $this->query(“SET NAMES ‘utf8’”);
四、phpMyAdmin 的安装配置(应该不用这步也行,不知道干什么用的)
下载 phpMyAdmin-2.6.1-pl3.zip,解压缩到WEB根目录(即 D:\website\Apache2\htdocs目录)中,重命名文件夹为 phpmyadmin。
编辑phpmyadmin\config.inc.php 文件,找到这两行内容:
$cfg[’Servers’][$i][’user’] = ‘root’;
$cfg[’Servers’][$i][’password’] = ‘123456′;

五、WordPress 的安装就非常简单了,先在MySQL中为wordpress创建一个新的数据库(参照三与七),再改一个文件就够了
从Wordpress官方网站下载压缩包2.0版本,
–打开 wp-config-sample.php 文件,改名为 wp-config.php 文件,编辑如下字段:
  define(’DB_NAME’, ‘database_name’); // 数据库名
  define(’DB_USER’, ‘MySQL_user’); // MYSQL用户名
  define(’DB_PASSWORD’, ‘MySQL_pwd’); // MYSQL用户密码
  define(’DB_HOST’, ‘localhost’); // 一般情况下保持 localhost
–最后运行 http://localhost/wp/wp-admin/install.php 根据向导完成安装,要记住密码欧。

六、开启wordpress之Permalink for WAMP+WP2
开始以为是没有这个文件的问题,就在网上搜了一堆.htaccess文件试验,看到了一堆外星文:
然后通过 search wordpress RewriteRule windows 找到别人的.htaccess文件试验
最后发现http://www.sparanoid.com/2005/11/这位仁兄的一句话给我了提示:
进入 wp 后台,开启 permalinks 即可!!
In summary, it is very simple to get the permanent link functionality (for WAMP+WP2):
I. edit httpd.config
1). enable LoadModule rewrite_module modules/mod_rewrite.so
2). find <Directory “D:/website/Apache2/htdocs”> Options Indexes FollowSymLinks, change to AllowOverride All
II. Login your wordpress site and go to the dashboard, configure it in Options/Permalinks [Edit Permalink Structure]
在WordPress中设置PermaLink的方法:
选项(Option)==>永久链接(Parmalink)设置中:wp-admin/options-permalink.php
还需要编辑一下每个目录的Slug(类别简称)属性:管理==>类别==>编辑类别中,将每个目录设置为英文名称
对于WAMP而言,.htaccess 文件是自动产生的,根本就不用管他,还得我白忙乎了一上午。

七、顺便还学习了最基本的MySQL数据库操作命令,注意一定加分号,实际上大部分可以通过MySQL Administrator实现
mysql> SHOW DATABASES;
mysql> CREATE DATABASE abccs;
mysql> DROP DATABASE;
mysql> USE abccs;
mysql> SHOW TABLES;
mysql> CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1),
-> birth DATE, birthaddr VARCHAR(20)); 创建一个数据库表
mysql> SHOW TABLES;
mysql> DESCRIBE mytable; 显示表的结构
mysql> select * from mytable; mysql> insert into mytable
-> values (′abccs′,′f′,′1977-07-07′,′china′); 往表中加入记录
mysql> LOAD DATA LOCAL INFILE “mytable.txt” INTO TABLE pet; 用文本方式将数据装入一个数据库表

八、最后就是用客户端工具发布了!!
API: http://127.0.0.1/wordpress/xmlrpc.php
能看到但不能发布:Post error: TResult.GetString-Item is not a string type
不知道什么原因

九、出错分析
Test apache: http://localhost http://127.0.0.1/
Test mysql: http://127.0.0.1/phpinfo.php
[error] 500 Internal Server Error 出现500错误 –.htaccess problem
[client 127.0.0.1] File does not exist: D:/website/Apache2/htdocs/favicon.ico
[reply]
Find that whenever run localhost, even run ok, still signal error favicon.ico, but did not signal error 500.
So we can figure out that favicon.ico is not a problem
Try to compare httpd.conf, find the problems are existing in line 164 241 275
[alert] [client 127.0.0.1] D:/website/.htaccess: RewriteRule: bad argument line ‘./index.php’
even move the .htaccess to root, still get this error.
move out of the website, then things are ok.
[refer]
我试着在自己的机器上安装论坛
使用apache+php构建
所有安装都已正确(失败了好几次,呵呵),测试成功运行。
我安装的是水晶论坛,所有安装都顺利完成。
并成功打开admin.php对论坛的各项参数进行设置。
当我以为大功告成时,问题来了:
每当我试图打开index.php时,apache都会报错,并自动关闭。
为什么我用浏览器可以打开admin.php,却无法打开index.php呢?
日志中说没有favicon.ico文件,我找过了,没有该文件。
-能不能提供一份favicon.ico文件,我拷进去试试看
-www.linuxsky.net/favicon.ico
-我已经拷贝了favicon.ico文件,问题依然存在!
 -favicon.ico 文件应该不是导致整个文件打不开的原因,如果你用firefox 或者 opera 打开本站会看到地址栏中地址前面有一颗小星星,这颗小星星就是那个favicon.ico 文件。

十、手工配置,绿色安装
I.apache and php are already green, i.e., run without installation, but need manual configuration, see their help files respectively.
II.sql also provide non-install zip file, also refer to its doc files.
Help file:
2.3.6. Installing MySQL from a Noinstall Zip Archive
1.Do not need to copy my.ini to C:\windows; just put it under D:\website\mysql.
non-install version has more lib files than the install one?
2.use this cmd can start the service(for both install and non-install version), then use the mysql administrator
D:\website\mysql\bin\mysqld –console
if see mysqld: ready for connections, it is ok
D:\website\mysql\bin\mysqladmin -u root shutdown
2.3.12. Starting MySQL as a Windows Service
Install the server as a service using this command:
bin:\> mysqld –install

======================================
2006-2-10 16:04
[error]在运行里输入ms-dos 命令正常可用,但在dos界面下(即运行run->cmd后出现的界面,或附件->msdos)输入任何命令都不好用,提示
如运行’ipconfig’:’ipconfig’ is not recognized as an internal or external command,operable program or batch file.
但在运行里用’ipconfig’就正常,可是一闪就没了,看不清楚
a) when I tried to run ipconfig from the DOS prompt, I got “ipconfig is not recognized as an internal or external command, operable program or batch file”
b) when I tried to run ipconfig from the Run menu, everything is ok
[answer]
i.e.,在path 里面加上C:\Windows;C:\Windows\System32;就可以了。注意是加上,千万别替代。
[refer]
find answer here:
1.http://www.techwarelabs.com/community/viewtopic.php?start=15&t=3131
well here is a variation on the same issue, what do people think?
a) when I tried to run ipconfig from the DOS prompt, I got “ipconfig is not recognized as an internal or external command, operable program or batch file”
b) when I tried to run ipconfig from the Run menu, I would get an error message telling me that ipconfig is not a recognized and that Windows could look online for the right program or I could select from a list
Well, I fixed a) by going to Computer -> Properties -> Advanced -> Environment variables and replacing the PATH command (that somehow had been repplaced leading a folder for my Treo?) with C:\Windows;C:\Windows\System32, my ipconfig/all at the DOS prompt works, thought it still doesn’t from the RUN menu.
now that a) has been addressed, do people have any thoughts about b)?
2.http://www.fas.harvard.edu/computing/kb/kb0909.html
QUESTION:
When I run ‘ipconfig’ at the command prompt in Windows, I receive the following error message: “‘ipconfig’ is not recognized as an internal or external command, operable program or batch file.” What can be done to fix this?
ANSWER:
Try specifying the full name for the ipconfig file:
    c:\windows\system32\ipconfig.exe
If this works, something is probably wrong with the PATH environment variable. To see it, enter this at the command prompt:
    echo %PATH%
Its value should be something like:
    C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
To set its value, enter this:
[hints]
search repair dos xp “is not recognized as an internal or external command,operable program or batch file.” in google

[Reference] Install WordPress for myself
http://alexhuang.org/  powered by WP
http://my.donews.com/liuren/2006/01/27/wordpress%E7%AE%80%E6%98%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/ 刘韧Blog for Virtual host
http://www.qiantu.org/?p=167 WordPress的架设指南 for vitual host
http://www.swoofware.com/index.php?p=2  WIMP (Windows + IIS + MySQL + Perl/PHP/Python)
http://groups.google.com/group/WordPressCN

Posted by micas on Jul 31st 2007 | Filed in SEO | Comments (0)

解决MySQL 中文查询 条件问题

public static Connection getConnection() {

        Connection conn = null;
        try {
            Class.forName(”com.mysql.jdbc.Driver”).newInstance();
            conn = DriverManager
                    .getConnection(
                            “jdbc:mysql://server:3306/” +
                            “schema??useUnicode=true&characterEncoding=utf8″,
                            “table”, “passwd”);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

Posted by micas on Jul 29th 2007 | Filed in SEO | Comments (0)

HTMLParser的两种使用方法 -forward

 

因为论文的关系,要用到HTMLParser这个项目(使用的HTMLParser版本是1.6)

一,数据组织分析:

HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单,此处就将其忽略了。

  • Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。
  • AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode实现了大多基本的方法,使得它的子类,不用理会具体的树操作。
  • Tag是具体分析的主要内容。Tag分成composite的Tag和不能包含其他Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。

Node分成三类:

  • RemarkNode:代表Html中的注释
  • TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。
  • TextNode:文本节点

二,Visitor方式访问Html:

1,整体解析过程

  • 用一个URL或页面String做一个Parser
  • 用这个Parser做一个Visitor
  • 使用Parser.visitAllNodeWith(Visitor)来遍历节点
  • 获取Visitor遍历后得到的数据

2,Visit过程

  • 做解析之前做的事情:visitor.beginParsing();
  • 每次取到一个节点Node,让该Node接受accept该Visitor
  • 做解析后做的事情:visitor.finishedParsing();

3,获取节点的过程:逐步遍历Html,分析出Node。此部分较为复杂,且对于我们应用来说无需很多了解,暂跳过。

4,节点访问

节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是关键。

首先三类Node来accept的方式各不相同:

  • 对于所有TagNode都使用一个accept方法,即TagNode的accept方法。首先判断是否是标签结尾,如果是就visitor.visitEndTag (this);否则visitor.visitTag (this);
  • 如果是TextNode,那就visitor.visitStringNode (this);就可以了。
  • 如果是RemarkNode,那就visitor.visitRemarkNode (this);就可以了。

实际上NodeVisitor里边这四种visit方法都是空的,因为在不同的Visitor中对于这三类节点的处理是不同的;对于需要处理的节点,只要重载对应的visit方法就行了,如果不处理那就不理会就可以了;另外,如果用户用自己的Visitor,那么还可以灵活的处理不同类型的节点了。

系统为我们实现了下面我要介绍的8种Visitor,实际上可以看作是系统给我们演示了如何做各种各样的Visitor来访问Html,因为实际上我们要真正来用HtmlParser的话,还需要特定的Visitor,而通过简单的这些系统提供的Visitor组合是难以做成什么事情的。

三,系统Visitor功能简介:

  • ObjectFindingVisitor:用来找出所有指定类型的节点,采用getTags()来获取结果。
  • StringBean:用来从一个指定的URL获取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之间代码的Html代码,也可以用做Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。
  • HtmlPage:提取Title,body中的节点和页面中的TableTag节点。
  • LinkFindingVisitor:找出节点中包含某个链接的总个数。
  • StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。
  • TagFindingVisitor:找出指定Tag的所有节点,可以指定多种类型。
  • TextExtractingVisitor:从网页中把所有标签去掉来提取文本,这个提取文本的Visitor有时是很实用的,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如<a>中的链接也去掉了。
  • UrlModifyingVisitor:用来修改网页中的链接。

四,Filter

如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据组织。

系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。

Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:

NodeList nodeList = myParser.parse(someFilter);

解析之后,我们可以采用:

Node[] nodes = nodeList.toNodeArray();

来获取节点数组,也可以直接访问:

Node node = nodeList.elementAt(i)来获取Node。

另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的 extractAllNodesThatMatch(someFilter)来进一步过滤,同时又可以用NodeList的 isitAllNodesWith(someVisitor)来做进一步的访问。

这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用 visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。

我的代码

package com.eric.Html.htmlparser;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.HasChildFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.TextExtractingVisitor;

/** *//**
 * @author 作者 Eric yang E-mail:yjboy1982@126.com
 * @version 创建时间:2007-7-16 下午02:49:55
 * 类说明
*/
public class AstroExtractorTest …{

/** *//**
     * @param args
     * @throws ParserException 
*/
public static void main(String[] args) throws ParserException …{
// TODO Auto-generated method stub
        String title ;
        String constellation ;
        String body ;
        String summary ;

        Parser parser = new Parser(”http://astro.sina.com.cn/sagittarius.html”);
        parser.setEncoding(”GB2312″) ;

        NodeFilter filter_constellation_summart = new AndFilter((new TagNameFilter(”td”)),(new HasChildFilter(new TagNameFilter(”b”)))) ;

        NodeFilter filter_title = new AndFilter(new TagNameFilter(”font”), new HasAttributeFilter(”class”, ”f1491″)) ;

        NodeFilter filter_body = new AndFilter( new TagNameFilter(”td”), new HasAttributeFilter(”width”, ”30%”)) ;

        NodeList nodelist = parser.parse(filter_constellation_summart) ;
        Node node_constellation = nodelist.elementAt(0) ;        
        constellation = node_constellation.getFirstChild().getNextSibling().toHtml() ;

        Node node_summary = nodelist.elementAt(1) ;
        NodeList summary_nodelist = node_summary.getChildren() ;
        summary = summary_nodelist.elementAt(3).toHtml()+summary_nodelist.elementAt(5).toHtml()  ;

        parser.reset() ;

        nodelist = parser.parse(filter_title) ;
        Node node_title = nodelist.elementAt(0) ;
        title = node_title.getNextSibling().getNextSibling().toHtml() ;
//title = node_title.getNextSibling().getNextSibling().toHtml() ;

        parser.reset() ;

        nodelist = parser.parse(filter_body) ;
        Node node_body = nodelist.elementAt(0) ;
        Parser body_parser = new Parser(node_body.toHtml()) ;
        TextExtractingVisitor visitor = new TextExtractingVisitor() ;
        body_parser.visitAllNodesWith(visitor) ;
        body = visitor.getExtractedText() ;

//System.out.println(node_summary.getChildren().toHtml()) ;
//System.out.println(node_body.toHtml()) ;
//System.out.println(title.trim()) ;
//System.out.println(constellation.trim()) ;
//System.out.println(body.trim()) ;
        System.out.println(summary.trim()) ;

    }

}

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

HtmlParser初步研究 -forwad

 

 
这两天准备做一些网站编程的工作,于是对HtmlParse小研究了一下,目的是快速入手,而不是深入研究,做了一下整理,和大家共同讨论一下。

一,数据组织分析:

HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单,此处就将其忽略了。

  • Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。
  • AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode实现了大多基本的方法,使得它的子类,不用理会具体的树操作。
  • Tag是具体分析的主要内容。Tag分成composite的Tag和不能包含其他Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。

Node分成三类:

  • RemarkNode:代表Html中的注释
  • TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。
  • TextNode:文本节点

二,Visitor方式访问Html:

1,整体解析过程

  • 用一个URL或页面String做一个Parser
  • 用这个Parser做一个Visitor
  • 使用Parser.visitAllNodeWith(Visitor)来遍历节点
  • 获取Visitor遍历后得到的数据

2,Visit过程

  • 做解析之前做的事情:visitor.beginParsing();
  • 每次取到一个节点Node,让该Node接受accept该Visitor
  • 做解析后做的事情:visitor.finishedParsing();

3,获取节点的过程:逐步遍历Html,分析出Node。此部分较为复杂,且对于我们应用来说无需很多了解,暂跳过。

4,节点访问

节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是关键。

首先三类Node来accept的方式各不相同:

  • 对于所有TagNode都使用一个accept方法,即TagNode的accept方法。首先判断是否是标签结尾,如果是就visitor.visitEndTag (this);否则visitor.visitTag (this);
  • 如果是TextNode,那就visitor.visitStringNode (this);就可以了。
  • 如果是RemarkNode,那就visitor.visitRemarkNode (this);就可以了。

实际上NodeVisitor里边这四种visit方法都是空的,因为在不同的Visitor中对于这三类节点的处理是不同的;对于需要处理的节点,只要重载对应的visit方法就行了,如果不处理那就不理会就可以了;另外,如果用户用自己的Visitor,那么还可以灵活的处理不同类型的节点了。

系统为我们实现了下面我要介绍的8种Visitor,实际上可以看作是系统给我们演示了如何做各种各样的Visitor来访问Html,因为实际上我们要真正来用HtmlParser的话,还需要特定的Visitor,而通过简单的这些系统提供的Visitor组合是难以做成什么事情的。

三,系统Visitor功能简介:

  • ObjectFindingVisitor:用来找出所有指定类型的节点,采用getTags()来获取结果。
  • StringBean:用来从一个指定的URL获取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之间代码的Html代码,也可以用做Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。
  • HtmlPage:提取Title,body中的节点和页面中的TableTag节点。
  • LinkFindingVisitor:找出节点中包含某个链接的总个数。
  • StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。
  • TagFindingVisitor:找出指定Tag的所有节点,可以指定多种类型。
  • TextExtractingVisitor:从网页中把所有标签去掉来提取文本,这个提取文本的Visitor有时是很实用的,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如<a>中的链接也去掉了。
  • UrlModifyingVisitor:用来修改网页中的链接。

四,Filter

如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据组织。

系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。

Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:

NodeList nodeList = myParser.parse(someFilter);

解析之后,我们可以采用:

Node[] nodes = nodeList.toNodeArray();

来获取节点数组,也可以直接访问:

Node node = nodeList.elementAt(i)来获取Node。

另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的extractAllNodesThatMatch (someFilter)来进一步过滤,同时又可以用NodeList的isitAllNodesWith(someVisitor)来做进一步的访问。

这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

Userful API Reference for Projects

APIs:

  1. JDOM: http://www.jdom.org/docs/apidocs/
  2. HtmlParser:http://htmlparser.sourceforge.net/javadoc/

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

utf-8 JSP 文本文件读写的例子(原创)

<%@ page import=”java.util.Date” %>
<%@ page import=”java.io.*” %>
<%–
  Created by IntelliJ IDEA.
  User: Yang Yuan
  Date: Oct 29, 2005
  Time: 6:00:32 PM
  To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>
<html>
<head><title>Simple jsp page</title></head>

<body>

<%
    try {
        request.setCharacterEncoding(”utf-8″);
        String path = request.getSession().getServletContext().getRealPath(”/~micas/WorkExperience.txt”);
        FileOutputStream os = new FileOutputStream(path, true);
        OutputStreamWriter osw = new OutputStreamWriter(os, “utf-8″);

        String newPost = request.getParameter(”newPost”);
        if (null != newPost && !”".equalsIgnoreCase(newPost)) {
            osw.append(new Date() + “\r\n\t” + newPost + “\r\n—————–\r\n\r\n”);
        }
        osw.close();

        FileInputStream fis = new FileInputStream(path);
        InputStreamReader isr = new InputStreamReader(fis, “UTF8″);
        BufferedReader bf = new BufferedReader(isr);
        String string = null;
        out.println(”<pre>”);

        while ((string = bf.readLine()) != null) {
            out.println(string);
        }
        out.println(”</pre>”);
        bf.close();
    } catch (Exception ex) {
        out.println(ex);
    }
%>

<FORM METHOD=POST>
    New Post: <br>
    <TEXTAREA NAME=”newPost” ROWS=”20″ COLS=”100″></TEXTAREA><br>
    <input type=submit value=”Submit”>
</FORM>

</body>
</html>

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

用JDOM创建XML

package com.shanghai.waimai.xml.prototype;

//用jdom创建xml文档:CreateXML.java
import java.io.FileWriter;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class CreateXML {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CreateXML createXML = new CreateXML();
    }

    Element customer, name, age, sex, address, city, district, street;

    public CreateXML() {
        // 创建customer元素,并设置为xml根节点
        customer = new Element(”customer”);
        Document myDocument = new Document(customer);
        // 创建xml文档其它元素,并初始化元素名
        name = new Element(”name”);
        age = new Element(”age”);
        sex = new Element(”sex”);
        address = new Element(”address”);
        city = new Element(”city”);
        district = new Element(”district”);
        street = new Element(”street”);
        // 给xml每个元素添加内容值
        district.addContent(”hai dan qu”);
        name.addContent(”luojing”);
        age.addContent(”23″);
        sex.addContent(”female”);
        street.addContent(”bupt”);
        city.addContent(”beijing”);
        // 后者添加为前者的子元素
        address.addContent(street);
        address.addContent(district);
        address.addContent(city);
        //
        customer.addContent(name);
        customer.addContent(age);
        customer.addContent(sex);
        customer.addContent(address);
        //
        try {
            // 创建xml输出流
            XMLOutputter fmt = new XMLOutputter();
            // 创建文件输出流
            FileWriter writer = new FileWriter(”e:\\customer.xml”);
            // 设置xml文档格式
            Format f = Format.getPrettyFormat();
            fmt.setFormat(f);
            // 将生成的xml文档myDocument写入到writer里
            fmt.output(myDocument, writer);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

解决网站内容的抓取,分析,添加的流程。

解析html,得到每一条的数据

数据要分类:分类的规则和标志

每个entry在每个分类的标志要明

用以上规则生成xml,附加类别和tag等附加信息

xml to db

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

提取HTML中的文本信息

我们拿到一个HTML文本的时候我们并不在意它的格式,而只是想提取其中包含的文本信息。例如说为了在手机上显示一个超文本,如果直接显示的话那肯定会收到一大堆的错误,很多手机根本没有能力显示HTML信息,因此我们需要把存在于HTML中的文本提取出来并使用WML来重新组合以便手机可以正确的查看,这样做虽然丢失了格式,但是毕竟这种情况下更关心的是数据。下面给出一段程序完成这个功能,很简单!
/*
 * Created on 2004-7-11
 */
package com.clickcom.wcp.util;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;

/**
 * 用于处理HTML信息的工具集合
 * @author liudong
 */
public class HtmlUtils {

 /**
  * 抽取纯文本信息
  * @param inputHtml
  * @return
  */
 public static String extractText(String inputHtml) throws Exception{
  StringBuffer text = new StringBuffer();
  Parser parser = Parser.createParser(new String(inputHtml.getBytes(),”8859_1″));
  //遍历所有的节点
  NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter(){
   public boolean accept(Node node) {
    return true;
   }});
  Node node = nodes.elementAt(0);
  text.append(new String(node.toPlainTextString().getBytes(”8859_1″)));
  return text.toString();
 }

 public static void main(String[] args) throws Exception{
  String text = extractText(”<td>点击<b><a href=index.jsp>这里</a></b>回到首页</td>”);
  System.out.println(text);
 }

}

Posted by micas on Jul 28th 2007 | Filed in SEO | Comments (0)

« Prev - Next »