htmlparser抓取小说网页链接的问题
练习写爬虫,想利用爬虫抓取小说网站的小说。用htmlparser抓取特定的链接,比如这种格式:<aID="HeadNextLink"href="http://read.q...
练习写爬虫,想利用爬虫抓取小说网站的小说。
用htmlparser抓取特定的链接,比如这种格式:
<a ID="HeadNextLink" href="http://read.qidian.com/BookReader/3147324,52540420.aspx">第一章</a>
就是抓取后面带有章节名的链接,不会
新手不熟练,求教大牛,万分感谢! 展开
用htmlparser抓取特定的链接,比如这种格式:
<a ID="HeadNextLink" href="http://read.qidian.com/BookReader/3147324,52540420.aspx">第一章</a>
就是抓取后面带有章节名的链接,不会
新手不熟练,求教大牛,万分感谢! 展开
1个回答
展开全部
后面的就需要用正则这样的手段解析了,当然你要不嫌费事,也可以用字符串截取。
下面我提供一些正则解析的方法:
====================
//汉字范围u4E00-u9FA5
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/***********************
* create by fzw
* 2013年11月19日
* 正则的使用
************************/
public class sxtRegex01 {
public static void main(String[] args) {
p("检查是否匹配:"+"abc".matches("..."));
p("替换字符串:"+"abc123aa".replaceAll("\\d", "."));
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("fgha");
p("Pattern+Matcher方法验证匹配:"+m.matches());
p("------------------");
p("a".matches("[abc]"));
p("a".matches("[^abc]"));
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z(A-Z)]"));
p("R".matches("[A-Z&&(RFG)]"));
p("------------------");
p("a_8".matches("\\w{3}"));
p("\\".matches("\\\\"));
p("------------------");
p("hello sir".matches("h.*"));
p("hello sir".matches(".*ir$"));
p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//匹配单词边界,单词边界是空格出现的位置用\\b匹配
p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));//开头是一个空格,且不能是换行符,最后必须是换行
p("------------------");
Pattern p2 = Pattern.compile("\\d{3,5}");
String s = "123-4536-89789-000";
Matcher m2 = p2.matcher(s);
p(m2.matches());
m2.reset();//把吃进去的字符吐出来重新匹配,否经过m2.matches会吃进去字符 下面的匹配就不成功
p(m2.find());
p(m2.start()+"-"+m2.end());//找到了 就把首位位置打印下(必须找到才能打印)
p(m2.find());
p(m2.start()+"-"+m2.end());
p(m2.find());
p(m2.start()+"-"+m2.end());
p(m2.find());
p(m2.lookingAt());//每次都是才头上开始找
p("------------------");
Pattern p3 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加属性后,Patter.CASE_INSENSITIVE表示大小写不管
Matcher m3 = p3.matcher("java_Java_jAva_jAVa_IloveJava");
p(m3.replaceAll("JAVA"));//把所有的都替换为大写的
p("------------------按照单双数替换");
Pattern p4 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加属性后,Patter.CASE_INSENSITIVE表示大小写不管
Matcher m4 = p4.matcher("java_Java_jAva_jAVa_IloveJava fdasfas");
StringBuffer sb = new StringBuffer();
int i = 0;
while(m4.find()){
i ++;
if(i%2 == 0){
m4.appendReplacement(sb, "java");
}else{
m4.appendReplacement(sb, "JAVA");
}
}
m4.appendTail(sb);//把尾巴在再添加到buf上既是sb
p(sb);
p("------------------分组加括号只取数字一组");
Pattern p5 = Pattern.compile("(\\d{3,5})([a-z]{2})");
Matcher m5 = p5.matcher("123bb_78987dd_090po");
while(m5.find()){
p(m5.group(1));//grop括号里面第0组是整体,第一组是左起第一个括号,第二组是左起第二个括号
}
p("------------------贪婪的匹配与不贪婪匹配");
Pattern p6 = Pattern.compile("(.{3,10}?)[0-9]");//.{3,10}后面没问号就是贪婪匹配会陪到最长,如果{3,10}?加?号就是懒蛋匹配之匹配最少的,从3个开始找
Matcher m6 = p6.matcher("aaaa5dddd8");
while(m6.find()){//如果这里用if(m6.find)(){p(m6.start()+"-"+m6.end());} 那么之匹配第一个
p(m6.start()+"-"+m6.end());
}
p("------------------普通捕获");
Pattern p7 = Pattern.compile(".{3}");
Matcher m7 = p7.matcher("ab4dd5");
while(m7.find()){
p(m7.group());
}
p("------------------非捕获组");
Pattern p8 = Pattern.compile(".{3}(?=a)");//(?=a)这个是非捕获组的意思,最后一个是a而且还不把这个a取出来!!(?=a)这个要是写在前面 就不一样了
Matcher m8 = p8.matcher("ab4add5");
while(m8.find()){
p("后面不能是a的"+m8.group());
}
p8 = Pattern.compile("(?!a).{3}");//(?!a)前面不能是a的
m8 = p8.matcher("abbsab89");
while(m8.find()){
p("前面不能是a的"+m8.group());
}
//(?<!a)从后往前数 不是a的
//(?<=a)从后往前数 是a的
p("------------------去除><号匹配");
Pattern p9 = Pattern.compile("(?!>).+(?=<)");
Matcher m9 = p9.matcher(">编程中国<");
while(m9.find()){
p(m9.group());
}
p("------------------向前引用");
Pattern p10 = Pattern.compile("(\\d\\d)\\1");//这里面的1是向前引用,12是第一匹配到的,下一次在匹配出来12和前面相同 所以是true
Matcher m10 = p10.matcher("1212");
p(m10.matches());
p("------------------忽略大小写,正则内嵌");//(?i)非捕获组里面这个表示忽略大小写
p("java".matches("(?i)JAVA"));
}
public static void p(Object o){
System.out.println(o);
}
}
下面我提供一些正则解析的方法:
====================
//汉字范围u4E00-u9FA5
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/***********************
* create by fzw
* 2013年11月19日
* 正则的使用
************************/
public class sxtRegex01 {
public static void main(String[] args) {
p("检查是否匹配:"+"abc".matches("..."));
p("替换字符串:"+"abc123aa".replaceAll("\\d", "."));
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("fgha");
p("Pattern+Matcher方法验证匹配:"+m.matches());
p("------------------");
p("a".matches("[abc]"));
p("a".matches("[^abc]"));
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z(A-Z)]"));
p("R".matches("[A-Z&&(RFG)]"));
p("------------------");
p("a_8".matches("\\w{3}"));
p("\\".matches("\\\\"));
p("------------------");
p("hello sir".matches("h.*"));
p("hello sir".matches(".*ir$"));
p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//匹配单词边界,单词边界是空格出现的位置用\\b匹配
p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));//开头是一个空格,且不能是换行符,最后必须是换行
p("------------------");
Pattern p2 = Pattern.compile("\\d{3,5}");
String s = "123-4536-89789-000";
Matcher m2 = p2.matcher(s);
p(m2.matches());
m2.reset();//把吃进去的字符吐出来重新匹配,否经过m2.matches会吃进去字符 下面的匹配就不成功
p(m2.find());
p(m2.start()+"-"+m2.end());//找到了 就把首位位置打印下(必须找到才能打印)
p(m2.find());
p(m2.start()+"-"+m2.end());
p(m2.find());
p(m2.start()+"-"+m2.end());
p(m2.find());
p(m2.lookingAt());//每次都是才头上开始找
p("------------------");
Pattern p3 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加属性后,Patter.CASE_INSENSITIVE表示大小写不管
Matcher m3 = p3.matcher("java_Java_jAva_jAVa_IloveJava");
p(m3.replaceAll("JAVA"));//把所有的都替换为大写的
p("------------------按照单双数替换");
Pattern p4 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//加属性后,Patter.CASE_INSENSITIVE表示大小写不管
Matcher m4 = p4.matcher("java_Java_jAva_jAVa_IloveJava fdasfas");
StringBuffer sb = new StringBuffer();
int i = 0;
while(m4.find()){
i ++;
if(i%2 == 0){
m4.appendReplacement(sb, "java");
}else{
m4.appendReplacement(sb, "JAVA");
}
}
m4.appendTail(sb);//把尾巴在再添加到buf上既是sb
p(sb);
p("------------------分组加括号只取数字一组");
Pattern p5 = Pattern.compile("(\\d{3,5})([a-z]{2})");
Matcher m5 = p5.matcher("123bb_78987dd_090po");
while(m5.find()){
p(m5.group(1));//grop括号里面第0组是整体,第一组是左起第一个括号,第二组是左起第二个括号
}
p("------------------贪婪的匹配与不贪婪匹配");
Pattern p6 = Pattern.compile("(.{3,10}?)[0-9]");//.{3,10}后面没问号就是贪婪匹配会陪到最长,如果{3,10}?加?号就是懒蛋匹配之匹配最少的,从3个开始找
Matcher m6 = p6.matcher("aaaa5dddd8");
while(m6.find()){//如果这里用if(m6.find)(){p(m6.start()+"-"+m6.end());} 那么之匹配第一个
p(m6.start()+"-"+m6.end());
}
p("------------------普通捕获");
Pattern p7 = Pattern.compile(".{3}");
Matcher m7 = p7.matcher("ab4dd5");
while(m7.find()){
p(m7.group());
}
p("------------------非捕获组");
Pattern p8 = Pattern.compile(".{3}(?=a)");//(?=a)这个是非捕获组的意思,最后一个是a而且还不把这个a取出来!!(?=a)这个要是写在前面 就不一样了
Matcher m8 = p8.matcher("ab4add5");
while(m8.find()){
p("后面不能是a的"+m8.group());
}
p8 = Pattern.compile("(?!a).{3}");//(?!a)前面不能是a的
m8 = p8.matcher("abbsab89");
while(m8.find()){
p("前面不能是a的"+m8.group());
}
//(?<!a)从后往前数 不是a的
//(?<=a)从后往前数 是a的
p("------------------去除><号匹配");
Pattern p9 = Pattern.compile("(?!>).+(?=<)");
Matcher m9 = p9.matcher(">编程中国<");
while(m9.find()){
p(m9.group());
}
p("------------------向前引用");
Pattern p10 = Pattern.compile("(\\d\\d)\\1");//这里面的1是向前引用,12是第一匹配到的,下一次在匹配出来12和前面相同 所以是true
Matcher m10 = p10.matcher("1212");
p(m10.matches());
p("------------------忽略大小写,正则内嵌");//(?i)非捕获组里面这个表示忽略大小写
p("java".matches("(?i)JAVA"));
}
public static void p(Object o){
System.out.println(o);
}
}
追问
如果要检查一个字符串中有没有"第?章"(?表示任意字符)这样的字符串,怎么弄?
追答
不知道你是否会正则,你这个只需要
定义正则字符串:String str = "第.{1,}章"
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询