`
hz_chenwenbiao
  • 浏览: 1006415 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

提取html内容放入xml文件时空格问题

阅读更多

由于项目的需要,将网站上的信息抓取下来,提取出想要的信息,然后保存在xml文件里,再将xml文件上传一服务器,这个过程中,我想将原来网页上的信息的换行和空格标签保存在xml文件里去,但是直接将<br>标签放在xml文件里,显然不行,因为在xml文件里会当作xml标签,所以我就将<替换为&lt;而>就替换为&gt;这样就可以与xml的标签区分开来,但是空格&nbsp;放在xml文件里竟然有问题,xml解析它时会抛出如下异常:

org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared. 


 

后来看了下面的文件后,就将&nbsp;改为&#160; 这样可以让xml解析器解析正确,在myeclipse下调试,看到的串显示也是正确的,不过用System.out.println()打印出来会在有&#160;的地方显示三个问号,我再根据下面的文章,将这个串用replaceAll("\240$", "&nbsp;")方法替换回空格,再存放数据库,但是我这里不行,还是显示出三个问题,后来再查了一下,原来将&nbsp;替换为&amp;nbsp;然后写入xml文件,后面由xml解析器解析出来的就成了nbsp;也正是我想要的空格,可以直接放入数据库中去。

 

 

参考:

奇怪的编码,奇怪的显示——一个关于&nbsp;的故事

我们常常会解析html,解析html通常来说有两种方法,其一是直接对html进行解析,其二是将html转换到xml再解析。因为学习成本的关系,越来越倾向于使用后者来实现。第二种方法一个常用的工具就是:neko html parser,他将html转换到xml,又使用了Xerces2进行xml操作。 

于是问题开始了,在html中的&符号表示的一些特别意义,在xml中往往没有定义,比如今天我要讲的&nbsp; 他在html中表示non-breaking space,但是你不能用同样的方式在xml中表示,因为xml中&开头表示,可解析的实体,这个实体被DTD预先定义,而&nbsp;并没有被定义,所有如果用Xerces2来解析出现这样字符的xml文件(当然,这里假设你也没有自己预先定义),会抛出如下异常: 
org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared. 
一般给出如下的解决方案:使用&#160; 这又是什么道理呢?因为这是HTML ISO-8859-1 Reference 定义的规范,如下: 
Character Entity Number Entity Name Description 
           &#160;  &nbsp; non-breaking space 
neko html parser也这是使用的这样的方案,所以当解析这样一句html的时候: 
<td> 
    big black bear bit back the big black bug.&nbsp; 
</td> 

就bei neko html parser替换成了 

<td> 
    big black bear bit back the big black bug.&#160; 
</td> 

如果这样就完了,就不会有今天这篇文章了。 
但是替换之后,通过xml解析输出,显示的不是一个空格而是一个 ?,最要人命的地方了是这个?并不是ascii 中的063d。所以当我们通过getTextContent()方法的时候,我们得到的是: 
big black bear bit back the big black bug.? 

在实际应用中,当然需要出去这个?,于是我们打算使用replaceAll("\\?$", "")来替换掉这个?,但是你错了,你被你的眼睛骗了,这时你会发现根本不起作用你应该是用replaceAll("\240$", ""),240是160的八进制数。 

 

后记:

原来让xml不解析大小于号等xml关键字符,可以用:

 

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

详见:http://www.w3school.com.cn/xml/xml_cdata.asp

 

分享到:
评论

相关推荐

    java把文档对象转为html

    而`.jar`文件放入项目中,这是标准的Java类库引用方式,使得项目能够运行并调用相关的转换方法。 6. **性能和优化**: - 转换大型文档可能会消耗大量资源,因此在实际应用中可能需要考虑分块处理或异步转换。 - ...

    Python Cookbook

    14.13 通过模板将数据放入Web页面 527 14.14 在Nevow中呈现任意对象 530 第15章 分布式编程 534 引言 534 15.1 实现一个XML-RPC方法调用 536 15.2 服务XML-RPC请求 537 15.3 在Medusa中使用XML-RPC 539 15.4...

    Webscraping-Python:在Amazon网站上执行过Web抓取,以将有关畅销书的数据提取为可以导入的有用形式

    4. **清洗和整理数据**:将提取的数据放入Pandas DataFrame,进行必要的数据清洗和格式化,比如去除空格、转换数据类型等。 5. **保存数据**:最后,我们可以将整理好的数据保存为CSV或JSON文件,以便于其他工具...

    ik-analyzer-8.5.0 完整资源包

    1. 下载 `ik-analyzer-8.5.0.jar` 文件并将其放入Solr的 `lib` 目录下。 2. 配置Solr的 `schema.xml` 文件,指定使用 `ik-analyzer` 作为字段的分词器。 3. 重启Solr服务以应用改动。 4. 对于自定义词典,将自定义的...

    wikipedia-mirror:将下载和设置本地维基百科实例的 Makefile

    用法 查看示例并解决它;) 构建一切 基本上,您要做的就是将一些 sql 文件加载到 sql 数据库中,然后让依赖关系树找到它的方式来执行此操作。...这将提取 xml 并用空格替换所有无效字符。 然后重新运行sql-load-po

    Visual Studio .NET Tips and Tricks.pdf

    #### 将代码放入工具箱 通过右键点击代码片段并选择“添加到工具箱”,可以将常用的代码片段或用户控件添加到工具箱,便于以后在其他项目中重复使用。 #### 使用剪贴板环 Visual Studio .NET中的剪贴板环功能允许...

    C#编程经验技巧宝典

    数据处理 91 &lt;br&gt;5.1 数字处理技巧 92 &lt;br&gt;0140 如何对计算结果四舍五放入 92 &lt;br&gt;0141 如何将商品金额小写转换成大写 92 &lt;br&gt;0142 如何根据生日自动计算员工年龄 93 &lt;br&gt;0143 如何设置...

    JavaScript网页特效范例宝典源码

    实例104 从指定URL中提取文件名 164 3.3 随机函数 166 实例105 随机产生指定位数的验证码 166 实例106 生成随机字符串 167 3.4 日期与时间 169 实例107 显示长日期格式的系统日期 169 实例108 实时显示系统时间 171 ...

    易语言程序免安装版下载

    修改核心支持库,解决用“播放音乐()”播放“音频采样大小为24位”的WAV文件时产生噪音的BUG。 4. 修改编译器,可以为编译出的EXE、DLL添加版本信息(通过“程序配置”设定)。 5. 修改集成开发环境,自动记忆非...

Global site tag (gtag.js) - Google Analytics