Как насчет этого?
var input = new List { "a", "g", "e", "w", "p", "s", "q", "f", "x", "y", "i", "m", "c" };
var k = 3
var res = Enumerable.Range(0, (input.Count - 1) / k + 1)
.Select(i => input.GetRange(i * k, Math.Min(k, input.Count - i * k)))
.ToList();
Насколько я знаю, GetRange () является линейным по количеству принятых элементов. Так что это должно хорошо работать.
Еще один синтаксический анализатор html Мне очень понравилось использовать jsoup . Вы можете получить все <p>
элементы в 2 строках кода.
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
или если вы хотите их на отдельных строках вы можете перебирать элементы и записывать их отдельно.
У меня был успех с помощью TagSoup & amp; XPath для анализа HTML.
Возможно, вы используете неправильный инструмент для задания:
perl -ne "print if m|<p>| .. m|</p>|" infile.txt >outfile.txt
Использовать 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 () вы извлекаете текст.
Попробуйте это.
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();
}
}
jericho является одним из нескольких возможных html-парсеров, которые могли бы сделать эту задачу легкой и безопасной.
Попробуйте (если вы не хотите использовать библиотеку парсера 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)
{
}
}
}
<p>
и </p>
находятся в одной строке? В этом случае строка будет выписана дважды. Я думаю, это действительно зависит от ввода.
– pjp
6 September 2009 в 18:13
JTidy может представлять собой HTML-документ (даже некорректный) в качестве модели документа, что делает процесс извлечения содержимого тега <p>
более элегантным процессом, чем ручное разглаживание исходный текст.
p
(не семантическая разметка), я предполагаю, что это не сработает – sinθ 15 June 2014 в 00:36p
. Этот ответ правильный. – Basil Bourque 26 June 2014 в 07:49