我正在开发一个下载HTML页面的程序,然后选择一些信息并将其写入另一个文件。
我想提取段落标记之间的信息,但我只能获得段落的一行。我的代码如下;
FileReader fileReader = new FileReader(file);
BufferedReader buffRd = new BufferedReader(fileReader);
BufferedWriter out = new BufferedWriter(new FileWriter(newFile.txt));
String s;
while ((s = br.readLine()) !=null) {
if(s.contains("<p>")) {
try {
out.write(s);
} catch (IOException e) {
}
}
}
我试图添加另一个while循环,它会告诉程序继续写入文件,直到该行包含</p>
标记,然后说;
while ((s = br.readLine()) !=null) {
if(s.contains("<p>")) {
while(!s.contains("</p>") {
try {
out.write(s);
} catch (IOException e) {
}
}
}
}
但这不起作用。有人可以帮忙。
答案 0 :(得分:23)
我真正喜欢使用的另一个html解析器是jsoup。您可以通过2行代码获取所有<p>
个元素。
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
Elements ps = doc.select("p");
然后将其写入另一行的文件
out.write(ps.text()); //it will append all of the p elements together in one long string
或者如果你想要它们在不同的行上,你可以迭代元素并分别写出来。
答案 1 :(得分:9)
jericho是几个可行的html解析器之一,可以使这项任务既简单又安全。
答案 2 :(得分:4)
JTidy可以将HTML文档(甚至是格式错误的文档)表示为文档模型,使得提取<p>
标记内容的过程比通过原始文本手动转换更加优雅文本。
答案 3 :(得分:0)
尝试(如果您不想使用HTML解析器库):
FileReader fileReader = new FileReader(file);
BufferedReader buffRd = new BufferedReader(fileReader);
BufferedWriter out = new BufferedWriter(new FileWriter(newFile.txt));
String s;
int writeTo = 0;
while ((s = br.readLine()) !=null)
{
if(s.contains("<p>"))
{
writeTo = 1;
try
{
out.write(s);
}
catch (IOException e)
{
}
}
if(s.contains("</p>"))
{
writeTo = 0;
try
{
out.write(s);
}
catch (IOException e)
{
}
}
else if(writeTo==1)
{
try
{
out.write(s);
}
catch (IOException e)
{
}
}
}
答案 4 :(得分:0)
我使用TagSoup&amp;成功了用于解析HTML的XPath。
答案 5 :(得分:0)
使用ParserCallback。它是一个包含在JDK中的简单类。它会在每次找到新标签时通知您,然后您可以提取标签的文本。简单的例子:
import java.io.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class ParserCallbackTest extends HTMLEditorKit.ParserCallback
{
private int tabLevel = 1;
private int line = 1;
public void handleComment(char[] data, int pos)
{
displayData(new String(data));
}
public void handleEndOfLineString(String eol)
{
System.out.println( line++ );
}
public void handleEndTag(HTML.Tag tag, int pos)
{
tabLevel--;
displayData("/" + tag);
}
public void handleError(String errorMsg, int pos)
{
displayData(pos + ":" + errorMsg);
}
public void handleMutableTag(HTML.Tag tag, MutableAttributeSet a, int pos)
{
displayData("mutable:" + tag + ": " + pos + ": " + a);
}
public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet a, int pos)
{
displayData( tag + "::" + a );
// tabLevel++;
}
public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos)
{
displayData( tag + ":" + a );
tabLevel++;
}
public void handleText(char[] data, int pos)
{
displayData( new String(data) );
}
private void displayData(String text)
{
for (int i = 0; i < tabLevel; i++)
System.out.print("\t");
System.out.println(text);
}
public static void main(String[] args)
throws IOException
{
ParserCallbackTest parser = new ParserCallbackTest();
// args[0] is the file to parse
Reader reader = new FileReader(args[0]);
// URLConnection conn = new URL(args[0]).openConnection();
// Reader reader = new InputStreamReader(conn.getInputStream());
try
{
new ParserDelegator().parse(reader, parser, true);
}
catch (IOException e)
{
System.out.println(e);
}
}
}
所以你需要做的就是在找到段落标记时设置一个布尔标志。然后在handleText()方法中提取文本。
答案 6 :(得分:0)
试试这个。
public static void main( String[] args )
{
String url = "http://en.wikipedia.org/wiki/Big_data";
Document document;
try {
document = Jsoup.connect(url).get();
Elements paragraphs = document.select("p");
Element firstParagraph = paragraphs.first();
Element lastParagraph = paragraphs.last();
Element p;
int i=1;
p=firstParagraph;
System.out.println("* " +p.text());
while (p!=lastParagraph){
p=paragraphs.get(i);
System.out.println("* " +p.text());
i++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 7 :(得分:-2)
您可能只是使用了错误的工具:
perl -ne "print if m|<p>| .. m|</p>|" infile.txt >outfile.txt