您的位置:首页 > Web前端 > HTML

meta标签有毒

2016-05-29 15:41 363 查看
今天要完成的一项工作是:从 html文件中提取,title标签

原本以为是很简单的工作呢。可是一个素食网站里面,像这些http://www.chinavegan.com/2015/05/2015051718461747.html

网页,当我用 httpclient下载页面,然后用jsoup进行解析的时候,发现,document对象里面,title标签,h1标签统统都没有了。可是,我再去下载好的网页时看,咦,title、h1标签都是存在的啊。

怎么回事?

后俩比较一下 如下的两个网页:

http://www.chinavegan.com/2015/05/2015051718461747.htm

(抽不出 title、h1标签内容,因为jsoup解析的时候,documnet里面根本没有 这两类标签)

http://www.chinavegan.com/

(可以抽出 title、h1标签内容)

原因是:




看到没,下面那张图片里面少了:



~~~~~~~~~~~~~~~~~~~~

my god,我笨,我调了那么长时间,终于找到了错误。

然后:

我首先采取,手工 输入这句话,果然 普通页面也可以提取title了。

接着,我天真的以为,

方法一:可以通过 文件 读写的方式,来给每个 普通网页在title标签之前,加上

这句话。结果各种错误,说明这样使不可行的

方法二:

我采用 jsoup的各种方式,企图向head标签后面加入

事实证明是无用的。title标签依旧不在jsoup中。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以上两种方法,都没有抓住源头,源头的错误,应该是出现在下载网页的时候。方正,最后我参考了这篇文章,采用java的url,全部读取网页内容,然后使用正则表达式,终于搞定了,成功提取title.

参考的帖子:http://blog.csdn.net/yuyuyuyuy/article/details/6547430

package catchhtml;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetHtmlTitle {

public GetHtmlTitle(String htmlUrl){
System.out.println("/n------------开始读取网页(" + htmlUrl + ")-----------");
String htmlSource = "";
htmlSource = getHtmlSource(htmlUrl);//获取htmlUrl网址网页的源码
System.out.println("------------读取网页(" + htmlUrl + ")结束-----------/n");
System.out.println("------------分析(" + htmlUrl + ")结果如下-----------/n");
String title = getTitle(htmlSource);
System.out.println("网站标题: " + title);
}

/**
* 根据网址返回网页的源码
* @param htmlUrl
* @return
*/
public String getHtmlSource(String htmlUrl){
URL url;
StringBuffer sb = new StringBuffer();
try{
url = new URL(htmlUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));//读取网页全部内容
String temp;
while ((temp = in.readLine()) != null)
{
sb.append(temp);
}
in.close();
}catch (MalformedURLException e) {
System.out.println("你输入的URL格式有问题!请仔细输入");
}catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}

/**
* 从html源码(字符串)中去掉标题
* @param htmlSource
* @return
*/
public String getTitle(String htmlSource){
List<String> list = new ArrayList<String>();
String title = "";

//Pattern pa = Pattern.compile("<title>.*?</title>", Pattern.CANON_EQ);也可以
Pattern pa = Pattern.compile("<title>.*?</title>");//源码中标题正则表达式
Matcher ma = pa.matcher(htmlSource);
while (ma.find())//寻找符合el的字串
{
list.add(ma.group());//将符合el的字串加入到list中
}
for (int i = 0; i < list.size(); i++)
{
title = title + list.get(i);
}
return outTag(title);
}

/**
* 去掉html源码中的标签
* @param s
* @return
*/
public String outTag(String s)
{
return s.replaceAll("<.*?>", "");
}

public static void main(String[] args) {
String htmlUrl = "http://www.157buy.com";
new GetHtmlTitle(htmlUrl);

}
}


总结:jsoup+httpclient,虽然方便,

但是关键时刻还是得靠 正则表达式+java.url
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  html