Java使用正则表达式取网页中的一段内容(以取Js方法为例)

news/2024/7/19 8:42:39 标签: java, 爬虫, 人工智能

关于正则表达式:

表1.常用的元字符
代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束

 

表2.常用的限定符
代码/语法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

 

表3.常用的反义代码
代码/语法说明
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符

 

表4.常用分组语法
分类代码/语法说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

 

 

表5.懒惰限定符
代码/语法说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

 

 

表6.常用的处理选项
名称说明
IgnoreCase(忽略大小写)匹配时不区分大小写。
Multiline(多行模式)更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式)更改.的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白)忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获)仅捕获已被显式命名的组。

 

 

表7.其他
代码/语法说明
\a报警字符(打印它的效果是电脑嘀一声)
\b通常是单词分界位置,但如果在字符类里使用代表退格
\t制表符,Tab
\r回车
\v竖向制表符
\f换页符
\n换行符
\eEscape
\0nnASCII代码中八进制代码为nn的字符
\xnnASCII代码中十六进制代码为nn的字符
\unnnnUnicode代码中十六进制代码为nnnn的字符
\cNASCII控制字符。比如\cC代表Ctrl+C
\A字符串开头(类似^,但不受处理多行选项的影响)
\Z字符串结尾或行尾(不受处理多行选项的影响)
\z字符串结尾(类似$,但不受处理多行选项的影响)
\G当前搜索的开头
\p{name}Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp)贪婪子表达式
(?<x>-<y>exp)平衡组
(?im-nsx:exp)在子表达式exp中改变处理选项
(?im-nsx)为表达式后面的部分改变处理选项
(?(exp)yes|no)把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes)同上,只是使用空表达式作为no
(?(name)yes|no)如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes)同上,只是使用空表达式作为no

 

这几个表引自http://www.jb51.net/tools/zhengze.html#getstarted

下面以获取淘宝登录页面(https://login.taobao.com/member/login.jhtml)的一个js方法为例:

如下所示,取UA_Opt的定义这一段内容.

 

package com.amos;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test{
//main方法:
public static void main(String args[]){
HttpClient httpClient = new DefaultHttpClient();
        String loginURL = "https://login.taobao.com/member/login.jhtml";

        HttpGet httpGet = new HttpGet(loginURL);
        HttpResponse loginResponse = httpClient.execute(httpGet);
        String loginString = EntityUtils.toString(loginResponse.getEntity());
        System.out.println("loginString:\n"+loginString);
        Matcher matcher = Pattern.compile("var UA_Opt =(.*?)</script>").matcher(loginString.replaceAll("\\r|\\t|\\n|\\a",""));

        while(matcher.find()){
            System.out.println(matcher.group(1));
        }
        httpGet.releaseConnection();
}
}

注意上面的表格4的内容,这里用的就是上面的方法.

使用java截取js方法,首先,将换行符制表符回车符报警符都替换掉(loginString.replaceAll("\\r|\\t|\\n|\\a","")),这样在截取时就不会出问题了

截取的时候"var UA_Opt =(.*?)</script>",中间的(.*?)表示匹配任何内容,然后是以var UA_Opt=开的头,然后以</script>标签结尾,取到的内容,再以matcher.group(1),即取到了我们所需要的内容.

注意空格不要被替换掉了,不然一堆字符串就看的眼花了,最终的结果为:

new Object;   UA_Opt.ExTarget = [ 'TPL_password_1','J_Pwd1','J_PwdV'];   UA_Opt.ResHost = 'acjstb.aliyun.com';   UA_Opt.FormId = "J_StaticForm";   UA_Opt.LogVal = "log";    UA_Opt.Token = new Date().getTime()+":"+Math.random();     UA_Opt.ImgUrl = "";     UA_Opt.GetAttrs = ['href', 'src'];    UA_Opt.MaxMCLog = 150;     UA_Opt.MaxKSLog = 150;     UA_Opt.MaxMPLog = 150;     UA_Opt.MPInterval = 150;     UA_Opt.SendInterval = 10;     UA_Opt.SendMethod = 1;   UA_Opt.Flag = 131071;

 

 

 

 

 

 

 


http://www.niftyadmin.cn/n/1848224.html

相关文章

[转]查找问题的利器 - Git Bisect

转自&#xff1a;http://gitbook.liuhui998.com/5_4.html 假设你在项目的2.6.18版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的最好办法是: 手工逐步恢复(brute-force regression)项目历史, 找出是哪个提交(commit)导致了这个问题. 但是 linkgit:git…

vs 2010 如何用boost计算文件的crc值

1. 首先从官网下载boost库&#xff0c;http://nchc.dl.sourceforge.net/project/boost/boost/1.53.0/boost_1_53_0.7z只使用crc无需编译boost&#xff0c;只需要包含指定的 crc.hpp即可。2. 下载后解压到d盘&#xff1a;D:\boost_1_53_03. 建立控制台工程文件&#xff0c;并做如…

SVN提示:由于目标机器积极拒绝,无法连接 的解决方法

2019独角兽企业重金招聘Python工程师标准>>> 安装完TSVN之后&#xff0c;checkout时报错&#xff0c;并且后来在cmd命令行下&#xff0c;测试svn的3690端口是否打开&#xff1a;telnet localhost 3690 &#xff0c;结果也是不成功&#xff0c;后来发现少执行了一步操…

gvim 常用功能汇集

:%s/。/\r&/gc把所有句号&#xff0c;的替换成回车&#xff0c;并且保留句号。u是撤销&#xff0c;crrl r是重做如何使用VIM的列编辑模式&#xff1f;* windows1. 在命令模式使用下面的快捷键&#xff1a;CTRLq&#xff0c;小写的q就可以了2. 然后使用HJKL四个键来移动和选…

linux目录和用户的权限

目录和用户的权限一、Linux系统中文件权限1.1 Linux系统中三种基本权限文件权限的定义&#xff1a;对某个文件或目录的访问控制&#xff08;访问限制&#xff09;文件的三个属性&#xff1a;l 用户的所有者&#xff08;属主&#xff09;&#xff1a;当用户创建一个文件&#xf…

天猫浏览型应用的CDN静态化架构演变(转)

转自&#xff1a;http://wbj0110.iteye.com/blog/2036613 在天猫双11活动中&#xff0c;商品详情、店铺等浏览型系统&#xff0c;通常会承受超出日常数倍甚至数十倍的流量冲击。随着历年来双11流量的大幅增加&#xff0c;每年这些浏览型系统都要面临容量评估、硬件扩容、性能优…

ubuntu 12.10 如何升级到 ubuntu 13.04

控制台下键入如下命令即可。do-release-upgrade

ubuntu 12.10 安装后 占的硬盘空间 分区方案

/ 7G/boot 60M交换分区 你内存的2倍一般设置2G/ 20G/boot 200M剩下的给/home 所有的软件放到这里重装的时候&#xff0c;无需动这个目录了。