小说页面内容抽取

现在假设,我们用wget下载了网站中的很多小说,现在的目标是让机器去读这些页面,然后将其中真正的内容抽取出来,放到一个结构化的XML文件中。

一般说来,一本小说,如果有很多章,那么一般一章就是一个页面。并且这些章通常都放在同一个目录下。初步想法是,每个没有子目录的目录可以认为是一本书,其中的页面是书中的某一章。

 

那么parser可以这样写,先找到目录下的没有子目录的目录,并且这个目录下还有一些html文件。那么这基本可以锁定为一本书。

然后,就是确定书名了,书名在目录中一般都会有。如果能找到目录文件,按么找到书名应该不难了。

为了找到目录文件,首先扫描是否有index.html,如果有,直接去分析该页面的Title标签,应该会有所获。当然,如果这时候预先有一个书名词汇表,就更不会有问题了。

如果找不到index.html,那么就略过这个目录。(后续,可以根据具体情况添加其他的待扫描目录文件)

 

假定现在书名已经找到了,然后就开始扫描该目录下剩余的文件。假定每个文件为该书的一章或者一卷。现在需要找到到底是第几章,第几卷。这个第几章第几卷的内容可能出现在以下几个地方,1是title标签,这是最理想的情况,因此,最先应该扫描title标签,看其中是否含有”第*章”/”第*卷” 字样,如果有,那么就找到啦。然后提取”章/卷“后面的章/卷的标题。

有时候title标签中不一定有这个内容,那么就需要去其他标签中去提取了。因为其他的标签可能行有很多。比如有P,div,font,td,table,b,strong,等等,无法具体确定。这时候,只能逐个标签查找,从body开始,对于每个标签,其中如果含有超过三个汉字,那么就进行解析,看其中是否有第几章/第几卷/第几回字样,如果有,就把同一个标签中其余的汉字作为章/卷/回的标题。在解析过程中,如果有碰到某一标签的汉字字符数超过200个,那就停止解析,因为我们已经到正文了。

假定现在章/卷/回的标题已经找到了,现在要做的就是把该章的真正内容找到。正文的表现方式应该比较明显,很多中文,中间用P标签分隔,或者用BR分割。因此要找到一个标签,含有一大段中文,并且其中有BR,或者P标签。另外有一种就是用pre标签的,对于pre标签而言,其中的换行符是0x0a/0x0d/0x0a0d , 对应的是ASCII中的换行符。

然后就可以把这个内容抽取出来,作为该章的内容了。同时我们在XML中存储的不是整章内容,而是一段一段的内容,因此需要把整章内容风格成一段一段的内容。

至此,一个页面的内容被整理成第几章/章标题/内容段1/内容段2/…./内容段N。其中的第几章可以映射成数字,然后进行排序作为最后的排列顺序。

 

继续,关于实现的问题:

1.  get_book_title ($directory)   //传入一个目录名,找到该目录表示的书名。——————找index.html , 找不到直接结束处理。

2. get_chapter($file)   //传入一个文件名,是一章的内容,找到该章的章节号,章名和章的内容。

2->3. get_chapter_title()  找到章节号,章节标题。  通过title标签找。以及全文的正则表达式匹配”第*章/卷/回”。 如果找不到标题则直接结束当前文件的处理。

2->4: find_tag_for_content() , 找到包含章节内容的那个tag。    —–> 含有>100个汉字的最小标签,并且保证在其他标签中没有这么多汉字。同时清除该标签中不含中文的所有子标签。

2->5. parse_pre_tag($e)   //解析pre tag , 在这种情况下,假设章节号,章名,章内容都在这个标签中。章名等需要从段内容中清除。

2->6.parse_chapter_on_non_pre() ; //非pre情况,其中的内容可能被p标签分割,或者br标签分割,或者还有别的标签分割。

 



本文地址: http://www.bagualu.net/wordpress/archives/1862 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注