Извлечение содержимого из тегов HTML - PullRequest
1 голос
/ 25 марта 2012

У меня есть каталог, содержащий более 100 HTML-файлов.Мне нужно извлечь только содержимое внутри тегов <TITLE></TITLE> и <BODY></BODY>, а затем отформатировать их как:

TITLE, "BODY CONTENT" (то есть одна строка на документ)

Это будетбудет полезно, если результаты из каждого файла в массиве могут быть записаны в 1 гигантский текстовый файл.Я нашел следующую команду для форматирования документа в одну строку:

grep '^[^<]' test.txt | tr -d '\n' > test.txt

Несмотря на то, что какой-либо конкретный язык программирования не является предпочтительным, следующее будет полезно, если мне нужночтобы изменить его дальше: perl, shell (.sh), sed

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Вот что-то в Ruby с использованием Nokogiri.

require 'rubygems' # This line isn't needed on Ruby 1.9
require 'nokogiri'

ARGV.each do |input_filename|
  doc = Nokogiri::HTML(File.read(input_filename))
  title, body = doc.title, doc.xpath('//body').inner_text
  puts %Q(#{title}, "#{body}")
end

Сохраните это в файл .rb, например extractor.rb.Затем вам нужно убедиться, что Nokogiri установлен, запустив gem install nokogiri.

. Используйте этот скрипт следующим образом:

ruby extractor.rb /path/to/yourhtmlfiles/*.html > out.txt

Обратите внимание, что я не обрабатываю символы новой строки в этом скрипте, но выпохоже, это выяснилось.

ОБНОВЛЕНИЕ:

На этот раз он удаляет символы новой строки и начальные / конечные пробелы.

require 'rubygems' # This line isn't needed on Ruby 1.9
require 'nokogiri'

ARGV.each do |input_filename|
  doc = Nokogiri::HTML(File.read(input_filename))
  title, body = doc.title, doc.xpath('//body').inner_text.gsub("\n", '').strip
  puts %Q(#{title}, "#{body}")
end
0 голосов
/ 25 марта 2012

Вы можете сделать это с C # и LINQ.Быстрый пример загрузки файла:

    IDictionary<string, string> parsed = new Dictionary<string, string>();

    foreach ( string file in Directory.GetFiles( @"your directory here" ) )
    {
        var html = XDocument.Load( "file path here" ).Element( "html" );

        string title = html.Element( "title" ).Value;
        string body = html.Element( "body" ).Value;
        body = XElement.Parse( body ).ToString( SaveOptions.DisableFormatting );

        parsed.Add( title, body );
    }

    using ( StreamWriter file = new StreamWriter( @"your file path") )
    {
        foreach ( KeyValuePair<string, string> pair in parsed )
        {
            file.WriteLine( string.Format( "{0}, \"{1}\"", pair.Key, pair.Value ) );
        }
    }

Я не тестировал этот конкретный кусок кода, но он должен работать.HTH.

РЕДАКТИРОВАТЬ: Если у вас есть базовый путь к каталогу, вы можете использовать Directory.GetFiles() для получения имен файлов в каталоге.

...