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

Последнее исправление: Deleted (всего исправлений: 2)

Ну раскуривай доки по библиотекам для работы с 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 ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.