LINUX.ORG.RU

Помогите распарсить


0

0

Собственно сабж. Не буду описывать какими способами я уже пытался, ибо получится стена текста. Не осилил в общем.

Есть такая xml-ка

<SearchSuggestion version="2.0">
  <Query xml:space="preserve">Парсер
  </Query>
  <Section>
    <Item>
      <Text xml:space="preserve">Синтаксический анализ
      </Text>
      <Description xml:space="preserve">В информатике, синтакси́ческий
      ана́лиз (па́рсинг) — это процесс сопоставления линейной
      последовательности лексем (слов, токенов) языка с его формальной
      грамматикой. Результатом обычно является дерево разбора
      (синтаксическое дерево). Обычно применяется совместно с
      лексическим анализом. Синтаксический анализатор (парсер) — это
        программа или часть программы, выполняющая синтаксический
      анализ.
      </Description>
      <Url xml:space="preserve">http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7
      </Url>
      <Image source="http://upload.wikimedia.org/wikipedia/ru/thumb/d/db/Parsing-example.png/50px-Parsing-example.png"
             width="50" height="17"/>
    </Item>
    <Item>
      <Text xml:space="preserve">Parser
      </Text>
      <Description xml:space="preserve">Parser —
      объектно-ориентированный скриптовый язык программирования,
        созданный для генерации HTML-страниц на веб-сервере с поддержкой
      CGI.
      </Description>
      <Url xml:space="preserve">http://ru.wikipedia.org/wiki/Parser
      </Url>
    </Item>
  </Section>
</SearchSuggestion>

А мне нужно получать чистый текст вида

Парсер
    Синтаксический анализ
        В информатике, синтакси́ческий
        ана́лиз (па́рсинг) — это процесс сопоставления линейной
        последовательности лексем (слов, токенов) языка с его формальной
        грамматикой. Результатом обычно является дерево разбора
        (синтаксическое дерево). Обычно применяется совместно с
        лексическим анализом. Синтаксический анализатор (парсер) — это
        программа или часть программы, выполняющая синтаксический
        анализ.
    Parser
        Parser —
        объектно-ориентированный скриптовый язык программирования,
        созданный для генерации HTML-страниц на веб-сервере с поддержкой
        CGI.

Т.е. мне нужно выводить поля

    Query
        Text
        Description
        
        Text
        Description

        Text
        Description

        ...

Причем будет достаточно даже просто

        Text
        Description

        Text
        Description

        ...

Deleted

Ну раскуривай доки по библиотекам для работы с XML языка, на котором пишешь. Я для питона пользовал lxml.

jessey
()
Ответ на: комментарий от Bad_ptr

Возьми, например, perl и просто построчно распарсивай. Если везде такая структура, то можно и построчно сделать не замучиваясь особо с разбором тегов/параметров, разбиением там на всякие токены...

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Возьми, например, perl и просто построчно распарсивай. Если везде такая структура, то можно и построчно сделать не замучиваясь особо с разбором тегов/параметров, разбиением там на всякие токены...

Построчно не получится, форматирование я сделал для читабельности. Сам поток будет таким:

<?xml version="1.0"?><SearchSuggestion version="2.0" xmlns="http://opensearch.org/searchsuggest2"><Query xml:space="preserve">Москва</Query><Section><Item><Text xml:space="preserve">Москва</Text><Description xml:space="preserve">Москва́ — столица Российской Федерации, город федерального значения, административный центр Центрального федерального округа и центр Московской области, в состав которой не входит. </Description><Url xml:space="preserve">http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0</Url><Image source="http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Moscow_Urban_Agglomeration%2C_Russia%2C_LandSat-7_image.jpg/50px-Moscow_Urban_Agglomeration%2C_Russia%2C_LandSat-7_image.jpg" width="50" height="47" /></Item><Item><Text xml:space="preserve">Москва (река)</Text><Description xml:space="preserve">Москва́ (обычно Москва-река, в московском произношении с XIX века — Москва́река) — средняя река в Центральной России, в Московской и частично в Смоленской областях, левый приток Оки (бассейн Волги).</Description><Url xml:space="preserve">http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0_(%D1%80%D0%B5%D0%BA%D0%B0)</Url><Image source="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Chapel_on_source_of_Moskva_river.jpg/50px-Chapel_on_source_of_Moskva_river.jpg" width="50" height="38" /></Item></Section></SearchSuggestion>

Deleted
()
Ответ на: комментарий от Deleted

Ну тогда проще всего берёшь какую-то библиотеку для иксэмэля готовую, как уже посоветовали. Либо делаешь так, примерно:

Парсера_состояние = 'готов_парсить'

Пока тег = считать_тег(){функция тупо считывает текст от '<' до '>' и возвращает первый символ и слово, идущее сразу за ним, если же там нету '<' то возвращает текст от текущей позиции до '<'}:

    Если Парсера_состояние eq 'готов_парсить':
        Если тег eq '?xml' -> пропуск и переход к следующей итерации
        Если тег eq 'SearchSuggestion' -> пропуск и переход к следующей итерации
        Если тег eq 'Query' -> Парсера_состояние = 'Query_mode'

    Если Парсера_состояние eq 'Query_mode':
        ....
        Если тег eq '/Query' -> Парсера_состояние = 'готов_парсить'
    ....

И т.д. и т.п.

Bad_ptr ★★★★★
()
#!/usr/bin/perl

use v5.14;
use encoding 'utf8';
use XML::Twig;
use Text::Wrap;

XML::Twig
->new(
    twig_handlers => {
        Query       => sub { say $_->text },
        Text        => sub { say "\t", $_->text },
        Description => sub { say wrap "\t\t", "\t\t", $_->text },
    }
)
->parse(`curl 'http://ru.wikipedia.org/w/api.php?action=opensearch&search=%D0%9F%D0%B0%D1%80%D1%81%D0%B5%D1%80&limit=3&namespace=0&format=xml' 2>/dev/null`);
Парсер
        Синтаксический анализ
                В информатике, синтакси́ческий ана́лиз (па́рсинг) — это
                процесс сопоставления линейной последовательности лексем
                (слов, токенов) языка с его формальной грамматикой.
                Результатом обычно является дерево разбора (синтаксическое
                дерево). Обычно применяется совместно с лексическим
                анализом. Синтаксический анализатор (парсер) — это
                программа или часть программы, выполняющая синтаксический
                анализ.
        Parser
                Parser — объектно-ориентированный скриптовый язык
                программирования, созданный для генерации HTML-страниц на
                веб-сервере с поддержкой CGI. 
arsi ★★★★★
()
Ответ на: комментарий от arsi

блин, perl и twig круты... на python'е с expat'ом не так красиво :-)

from xml.parsers import expat
from urllib.request import urlopen

st = False

def start(name, attrs):
    global st
    if name in ('Query', 'Text', 'Description'):
        st = True
    else:
        st = False

def char_data(data):
    if st:
        print(data)

p = expat.ParserCreate()
p.CharacterDataHandler = char_data
p.StartElementHandler = start
p.Parse(urlopen('http://ru.wikipedia.org/w/api.php?action=opensearch&search=%D0%9F%D0%B0%D1%80%D1%81%D0%B5%D1%80&limit=3&namespace=0&format=xml').read())
Парсер
Синтаксический анализ
В информатике, синтакси́ческий ана́лиз (па́рсинг) — это процесс сопоставления линейной последовательности лексем (слов, токенов) языка с его формальной грамматикой. Результатом обычно является дерево разбора (синтаксическое дерево). Обычно применяется совместно с лексическим анализом. Синтаксический анализатор (парсер) — это программа или часть программы, выполняющая синтаксический анализ.
Parser
Parser — объектно-ориентированный скриптовый язык программирования, созданный для генерации HTML-страниц на веб-сервере с поддержкой CGI. 
ei-grad ★★★★★
()
Ответ на: комментарий от Bad_ptr

s/и возвращает первый символ и слово, идущее сразу за ним/и возвращает первый символ и слово, идущее сразу за '<'/
:)

Bad_ptr ★★★★★
()

Вот суть ЛОР'овского девелопмента, пятак способов РАСПАРСИТЬ xml.

tensai_cirno ★★★★★
()
Ответ на: комментарий от Deleted

> Спасибо, только в Debian Stable - perl v5.10.1

в данном случае «use v5.14;» == «use 5.010; use strict;». // просто замени первое на второе.

arsi ★★★★★
()

XPath

from lxml import etree
from urllib2 import urlopen

content = urlopen('http://ru.wikipedia.org/w/api.php?action=opensearch&search=%D0%9F%D0%B0%D1%80%D1%81%D0%B5%D1%80&limit=3&namespace=0&format=xml')

tree = etree.parse(content)
for node in tree.xpath('//ns:Query | //ns:Text | //ns:Description',
        namespaces={'ns':'http://opensearch.org/searchsuggest2'}):

    print node.text

baverman ★★★
()
Ответ на: комментарий от anonymous

А в данном случае xpath - не оверхэд?

Это надо уже у автора спрашивать, какие объемы надо парсить. Вообще, по опыту, lxml на хилом VDSе вполне быстро и нежруче справляется с 20МБ-ными портянками.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.