看看这个哪里出错了。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.regex.*;
import java.io.*;
import java.net.URL;
import java.sql.*;
class DataStructure2{
public String newTitle;
public String newUrl;
}class GroupMethod2{ //正则提取方法
String newsTitle;
String newsUrl;
public void regularGroup(String pattern,String matcher){
Pattern p=Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(matcher);
while(m.find()){
newsTitle+=m.group(1)+"\n";
newsUrl+=m.group(2)+"\n";
}
}
}class MySql2{
String username=" ";
String password=" ";
String url=" ";
String driver="com.mysql.jdbc.Driver";
String newsSQl;
public void insert(String insertSQL){ //数据库插入方法
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password);
Statement stmt=con.createStatement();
stmt.executeUpdate(insertSQL); //插入数据
stmt.close();
con.close();
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}
public void shownews(){ //数据库显示方法
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password); Statement stmt=con.createStatement();
ResultSet rs= stmt.executeQuery("select * from people");//显示当前数据库所有的内容。
while(rs.next()){
newsSQl+=rs.getString("id")+"\t"+rs.getString("Title")+"\t"+rs.getString("Url")+"\n";
}
rs.close();
stmt.close();
con.close();
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}
}public class TestCatchWeb2 extends JFrame{
MySql2 ms=new MySql2();
JButton
b1=new JButton("确定"),
b2=new JButton("导入到数据库"),
b3=new JButton("查看数据库");
JTextField
t1=new JTextField(30);
TextArea
t2=new TextArea(20,80);
JLabel
l1=new JLabel("您所查找的网页信息"),
l2=new JLabel("输入您要查找的网页");
String strUrl="http://news.sina.com.cn";
String title;
String urls;
int number;
TestCatchWeb2(){ //构造方法,画面板
setTitle("网页抓取");
JPanel p=new JPanel();
t1.setText(strUrl);
b1.addActionListener(new B1());
b2.addActionListener(new B2());
b3.addActionListener(new B3());
t2.setEditable(false);
//t2.setLineWrap(true);
p.setLayout(new FlowLayout());
p.add(t2);p.add(l1);
p.add(t1);p.add(l2);
p.add(b1);
p.add(b2);
p.add(b3);
add(p);
}
static class WL extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
class B1 implements ActionListener{ //确定按钮的实现
public void actionPerformed(ActionEvent e){
catches();
t2.append("标题是:"+"\n"+title+"\n");
t2.append("url地址是:"+"\n"+urls+"\n");
t2.append("共收集到"+number+"条信息");
}
}
class B2 implements ActionListener{ //导入数据库按钮的实现
public void actionPerformed(ActionEvent e){
}
}
class B3 implements ActionListener{ //数据库内容显示按钮的实现
public void actionPerformed(ActionEvent e){
}
}
public void catches(){ //网页提取部分
strUrl=t1.getText();
BufferedReader br;
try{
URL url=new URL(strUrl);
InputStreamReader isr=new InputStreamReader(url.openStream());
br=new BufferedReader(isr);
String strRead="";
String regularCatch="<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>";
GroupMethod2 gMethod=new GroupMethod2();
int m=0;
while((strRead=br.readLine())!=null){
gMethod.regularGroup(regularCatch,strRead);
if(!gMethod.newsTitle.equals("")){
title+="标题"+m+gMethod.newsTitle+"\n";
}
else if(!gMethod.newsUrl.equals("")){
urls+="URL地址"+m+gMethod.newsUrl+"\n";
}
}
br.close();
number=m;
}
catch(IOException e){
e.printStackTrace();
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestCatchWeb news=new TestCatchWeb();
news.addWindowListener(new WL());
news.setSize(640,420);
news.setVisible(true);
}}
这个是有界面的。标红的地方是正则提取部分。对于这一行网页源代码。我在这个程序中只能提取前面半部分
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.regex.*;
import java.io.*;
import java.net.URL;
import java.sql.*;
class DataStructure2{
public String newTitle;
public String newUrl;
}class GroupMethod2{ //正则提取方法
String newsTitle;
String newsUrl;
public void regularGroup(String pattern,String matcher){
Pattern p=Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(matcher);
while(m.find()){
newsTitle+=m.group(1)+"\n";
newsUrl+=m.group(2)+"\n";
}
}
}class MySql2{
String username=" ";
String password=" ";
String url=" ";
String driver="com.mysql.jdbc.Driver";
String newsSQl;
public void insert(String insertSQL){ //数据库插入方法
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password);
Statement stmt=con.createStatement();
stmt.executeUpdate(insertSQL); //插入数据
stmt.close();
con.close();
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}
public void shownews(){ //数据库显示方法
try{
Class.forName(driver);
Connection con=DriverManager.getConnection(url,username,password); Statement stmt=con.createStatement();
ResultSet rs= stmt.executeQuery("select * from people");//显示当前数据库所有的内容。
while(rs.next()){
newsSQl+=rs.getString("id")+"\t"+rs.getString("Title")+"\t"+rs.getString("Url")+"\n";
}
rs.close();
stmt.close();
con.close();
}
catch(ClassNotFoundException e){
e.printStackTrace() ;
}
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}
}public class TestCatchWeb2 extends JFrame{
MySql2 ms=new MySql2();
JButton
b1=new JButton("确定"),
b2=new JButton("导入到数据库"),
b3=new JButton("查看数据库");
JTextField
t1=new JTextField(30);
TextArea
t2=new TextArea(20,80);
JLabel
l1=new JLabel("您所查找的网页信息"),
l2=new JLabel("输入您要查找的网页");
String strUrl="http://news.sina.com.cn";
String title;
String urls;
int number;
TestCatchWeb2(){ //构造方法,画面板
setTitle("网页抓取");
JPanel p=new JPanel();
t1.setText(strUrl);
b1.addActionListener(new B1());
b2.addActionListener(new B2());
b3.addActionListener(new B3());
t2.setEditable(false);
//t2.setLineWrap(true);
p.setLayout(new FlowLayout());
p.add(t2);p.add(l1);
p.add(t1);p.add(l2);
p.add(b1);
p.add(b2);
p.add(b3);
add(p);
}
static class WL extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
class B1 implements ActionListener{ //确定按钮的实现
public void actionPerformed(ActionEvent e){
catches();
t2.append("标题是:"+"\n"+title+"\n");
t2.append("url地址是:"+"\n"+urls+"\n");
t2.append("共收集到"+number+"条信息");
}
}
class B2 implements ActionListener{ //导入数据库按钮的实现
public void actionPerformed(ActionEvent e){
}
}
class B3 implements ActionListener{ //数据库内容显示按钮的实现
public void actionPerformed(ActionEvent e){
}
}
public void catches(){ //网页提取部分
strUrl=t1.getText();
BufferedReader br;
try{
URL url=new URL(strUrl);
InputStreamReader isr=new InputStreamReader(url.openStream());
br=new BufferedReader(isr);
String strRead="";
String regularCatch="<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>";
GroupMethod2 gMethod=new GroupMethod2();
int m=0;
while((strRead=br.readLine())!=null){
gMethod.regularGroup(regularCatch,strRead);
if(!gMethod.newsTitle.equals("")){
title+="标题"+m+gMethod.newsTitle+"\n";
}
else if(!gMethod.newsUrl.equals("")){
urls+="URL地址"+m+gMethod.newsUrl+"\n";
}
}
br.close();
number=m;
}
catch(IOException e){
e.printStackTrace();
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestCatchWeb news=new TestCatchWeb();
news.addWindowListener(new WL());
news.setSize(640,420);
news.setVisible(true);
}}
这个是有界面的。标红的地方是正则提取部分。对于这一行网页源代码。我在这个程序中只能提取前面半部分
import java.util.regex.Pattern;
public class CatchWord {
public static void main(String[] args) {
Pattern p = Pattern
.compile("<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>");
String s = "<p data-client='important audit'>[<a href='http://news.sina.com.cn/c/2013-08-26/122228049554.shtml' target='_blank'>称王谷二人如胶似漆</a> <a href='http://news.sina.com.cn/c/2013-08-26/153528050748.shtml' target='_blank'>薄熙来最后陈述:我有大过对不起党和群众</a>]</p>";
Matcher m = p.matcher(s);
String newsTitle="";
while (m.find()) {
System.out.println("打印出url链接:" + m.group(1));
System.out.println("打印出标题:" + m.group(2));
System.out.println();
newsTitle+=m.group(2)+"\n";
String newsUrl=m.group(1);
System.out.println("URL是:"+newsUrl+"\n");
}
System.out.println("所有标题是:"+newsTitle);
System.out.println("group方法捕获的数据个数:" + m.groupCount() + "个");
}}
这是什么原因呢。不知道我哪里有错误。大神们给指点下。
newsTitle+=m.group(1)+" ";
newsUrl+=m.group(2)+" ";
试试
如果是换行原因的话,
正则改成
String regularCatch="(?s)<a href=.(\\w.+?). target=._blank.>([\u4E00-\u9FA5].+?)</a>";
就行了。
这样不行的。我觉得应该不是这里的问题吧。我这里是个while循环。就算用了\n应该也不会影响他的读取啊。
<p data-client="important audit">[<a href="http://news.sina.com.cn/c/2013-08-27/023928053793.shtml" target="_blank">案件侦查阶段近百人被调查</a> <a href="http://news.sina.com.cn/c/2013-08-26/122228049554.shtml" target="_blank">薄熙来:王立军暗恋谷开来不能自拔</a>]</p>这个网页中的标题和url。但是在我的程序里面只能截取案件侦查阶段近百人被调查
而后面的薄熙来:王立军暗恋谷开来不能自拔则被忽略了、这是什么原因。
改成
newsTitle+=m.group(1)+" ";
newsUrl+=m.group(2)+" ";
这样么?这样还是不行。
while(m.find()){
System.out.println(m.group(1)+","+m.group(2));
}
结果:
http://news.sina.com.cn/c/2013-08-27/023928053793.shtml,案件侦查阶段近百人被调查
http://news.sina.com.cn/c/2013-08-26/122228049554.shtml,薄熙来:王立军暗恋谷开来不能自拔
有问题再追问。。
while(m.find()){
System.out.println(m.group(1)+","+m.group(2));
}
结果:
http://news.sina.com.cn/c/2013-08-27/023928053793.shtml,案件侦查阶段近百人被调查
http://news.sina.com.cn/c/2013-08-26/122228049554.shtml,薄熙来:王立军暗恋谷开来不能自拔
有问题再追问。。
恩,我知道这样可以,就像我在二楼里面写的那个也可以单独地读取这一行。但是就是我在那个有界面的程序中只能输出前面半句(一楼的程序中)。要不再仔细帮我研究下?你也可以看看我在二楼贴出来的那个程序。
首先你得先把被检测的内容答出来看看是否一样,如果正则不变,一个能提取一个不能提取,那么只能是输入内容的问题。就像楼上面说的,加了忽略换行表示(?s)了么?
第二,"."代表的是什么?我看你正则中用了很多.,乱用.真的不合适。
最后,把要截取的字段(包括空格换行等等。。)和截取后你想要的效果发上来就行了。。
方便加个qq么。或许是我说的不明白,能否加个,我和你再仔细说说。我的是912247433
一行和整个网页(多行)只要加了(?s)就可以忽略换行的影响,
你可以直接把网页源码拷贝到txt文件中然后读出来做实验。。