[英]How to Extract data from HTML page using regex pattern in java
我正在尝试从html页面提取数据以将其存储在String数组中
在HTML页面中,值显示如下:
<tbody>
<tr>
<td style="width: 14%;">88055</td>
<td style="width: 19%;" class="gris">Ville</td>
<td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/88055/" >Amos</a></td>
<td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/880/" >Abitibi</a></td>
</tr>
<tr>
<td style="width: 14%;">85080</td>
<td style="width: 19%;" class="gris">Village</td>
<td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/85080/" >Angliers</a></td>
<td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/850/" >Témiscamingue</a></td>
</tr>
<tr>
<td style="width: 14%;">87050</td>
<td style="width: 19%;" class="gris">Municipalité</td>
<td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/87050/" >Authier</a></td>
<td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/870/" >Abitibi-Ouest</a></td>
</tr>
我只需要提取其中href = Municipality的字符串
女巫的意思是阿莫斯(Amos),天使(Angliers)等...并将它们存储在字符串数组中
到目前为止,我已经尝试过了,但我迷路了
public static final String EXPRESSION = "";//How to write the regex expression?
String [] data = new String [20]
URL url = new URL("http://myur.com");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
while ((ligne = in.readLine()) != null) {
//What to write here?
}
in.close();
PS:我知道最好的方法是改用HTML解析器,但是我真的被迫采用这种方式
非常感谢,
低音
您可以使用类似这样的方法来硬编码匹配具有municipalite
的网址,并将wrt中的文本获取为>
和<
字符。
这是我的数据文件:
<tbody>
<tr>
<td style="width: 14%;">88055</td>
<td style="width: 19%;" class="gris">Ville</td>
<td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/88055/" >Amos</a></td>
<td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/880/" >Abitibi</a></td>
</tr>
<tr>
<td style="width: 14%;">85080</td>
<td style="width: 19%;" class="gris">Village</td>
<td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/85080/" >Angliers</a></td>
<td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/850/" >Témiscamingue</a></td>
</tr>
<tr>
<td style="width: 14%;">87050</td>
<td style="width: 19%;" class="gris">Municipalité</td>
<td style="width: 33%;"><a href="repertoire-des-municipalites/fiche/municipalite/87050/" >Authier</a></td>
<td style="width: 34%;"><a href="repertoire-des-municipalites/fiche/mrc/870/" >Abitibi-Ouest</a></td>
</tr>
这是Java文件:
import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;
class test
{
public static void main (String[] args) throws java.lang.Exception
{
BufferedReader in = new BufferedReader(new FileReader(new File("data")));
String line="";
Pattern p=Pattern.compile("href\\s*=\\s*(?:\"|').*municipalite/[^>]*>(?:<.*>)*([^<]*)<.*$");
while ((line = in.readLine()) != null)
{
Matcher m=p.matcher(line);
while(m.find())
System.out.println(m.group(1));
}
in.close();
}
}
输出:
$ javac test.java
$ java test
Amos
Angliers
Authier
$
正则表达式细分:
href\\s*=\\s*(?:\"|').*municipalite/[^>]*>(?:<.*>)*([^<]*)<.*$
href\\\\s*=\\\\s*
匹配href,后跟0或多个空格,后跟=
,然后是0或多个空格
(?:\\"|')
-> (?:)
表示非捕获组,即它匹配单引号或双引号,但不捕获/记住它
.*municipalite/
匹配任何字符,直到municipalite/
出现
[^>]*>(?:<.*>)*
匹配URL其余部分中不是>
任何字符,然后匹配>
,然后尝试将0个或多个(所有可选)打开标记匹配为一个非使用此捕获组(?:<.*>)
([^<]*)
该组实际上将您的字符串捕获到组1中
<.*$
与行的其余部分匹配
我已经在python中显示了。 但是,我相信Java中的正则表达式是相同的。 使用Java函数查找匹配项。
import re
reg = r"<a href=.*?municipalite.*?>(.+?)</a>"
result = re.findall(html)
尝试".*\\\\bhref=\\"repertoire-des-municipalites/fiche/municipalite/\\\\d+/\\"[^>]*>([^<]*)<.*"
我的演示代码(如下)给出了控制台输出:
控制台输出
Amos
Angliers
Authier
示范代码
public class HrefRegex
{
public static void main(final String[] args)
{
final String[] sampleLines = new String[] {
" </tr>",
" <td style=\"width: 14%;\">88055</td>",
" <td style=\"width: 19%;\" class=\"gris\">Ville</td>",
" <td style=\"width: 33%;\"><a href=\"repertoire-des-municipalites/fiche/municipalite/88055/\" >Amos</a></td>",
" <td style=\"width: 34%;\"><a href=\"repertoire-des-municipalites/fiche/mrc/880/\" >Abitibi</a></td>",
" </tr>",
" <tr>",
" <td style=\"width: 14%;\">85080</td>",
" <td style=\"width: 19%;\" class=\"gris\">Village</td>",
" <td style=\"width: 33%;\"><a href=\"repertoire-des-municipalites/fiche/municipalite/85080/\" >Angliers</a></td>",
" <td style=\"width: 34%;\"><a href=\"repertoire-des-municipalites/fiche/mrc/850/\" >Témiscamingue</a></td>",
" </tr>",
" <tr>",
" <td style=\"width: 14%;\">87050</td>",
" <td style=\"width: 19%;\" class=\"gris\">Municipalité</td>",
" <td style=\"width: 33%;\"><a href=\"repertoire-des-municipalites/fiche/municipalite/87050/\" >Authier</a></td>",
" <td style=\"width: 34%;\"><a href=\"repertoire-des-municipalites/fiche/mrc/870/\" >Abitibi-Ouest</a></td>",
" </tr>",
};
final Pattern pattern = Pattern.compile(".*\\bhref=\"repertoire-des-municipalites/fiche/municipalite/\\d+/\"[^>]*>([^<]*)<.*");
for (final String s : sampleLines)
{
final Matcher matcher = pattern.matcher(s);
if (matcher.matches())
{
System.out.println(matcher.group(1));
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.