перевод игры в HTML для Python - PullRequest
1 голос
/ 09 января 2011

Итак, я хотел бы представить одну из пьес Шекспира, Гамлета, в следующих объектах (возможно, это не лучшее представление, если так, пожалуйста, скажите мне):

class Play():
  acts = []
  ...
  def add_act(self, act): acts.append(act)

class Act():
  scenes = []
  ...
  def add_scene(self, scene): scenes.append(scene)

class Scene():
  elems = []
  def __init__(self, title, setting=""): ...
  def add_elem(self, elem): elems.append(elem)
  ...

class StageDirection(): # elem
  def __init__(self, text): ...

class Line(): # elem
  def __init__(self, id, text, character = None): ...
  # A None character represents a continuation from the previous line
  # id could be, for example, 1.1.1

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

Вопрос в том, как получить структуру, основанную на этих классах (или что-то подобное), из кода HTML 4, который выглядит следующим образом:

<H3>ACT I</h3> 
<h3>SCENE I. Elsinore. A platform before the castle.</h3> 
<p><blockquote> 
<i>FRANCISCO at his post. Enter to him BERNARDO</i> 
</blockquote> 

<A NAME=speech1><b>BERNARDO</b></a> 
<blockquote> 
<A NAME=1.1.1>Who's there?</A><br> 
</blockquote> 

<A NAME=speech2><b>FRANCISCO</b></a> 
<blockquote> 
<A NAME=1.1.2>Nay, answer me: stand, and unfold yourself.</A><br> 
</blockquote> 

<A NAME=speech3><b>BERNARDO</b></a> 
<blockquote> 
<A NAME=1.1.3>Long live the king!</A><br> 
</blockquote> 

<A NAME=speech4><b>FRANCISCO</b></a> 
<blockquote> 
<A NAME=1.1.4>Bernardo?</A><br> 
</blockquote> 

<A NAME=speech5><b>BERNARDO</b></a> 
<blockquote> 
<A NAME=1.1.5>He.</A><br> 
</blockquote>  <!-- for more, see the source of shakespeare.mit.edu/hamlet/full.html -->

переводя это в нечто вроде этого:

play = Play()
actI = Act()
sceneI = Scene("Scene I", "Elsinore. A platform before the castle.")
sceneI.add_elem(StageDirection("Francisco at his post. Enter to him Bernardo."))
sceneI.add_elem(Line("Bernardo", "Who's there?"))
...

Конечно, я не ожидаю весь код, но какие библиотеки, а когда нет библиотек,логику я должен использовать?

Спасибо.

(Это для будущего проекта с открытым исходным кодом, и я изучаю Python для удовольствия, а не для домашней работы.)

Ответы [ 2 ]

4 голосов
/ 09 января 2011

Используйте lxml или подобный парсер.Они будут читать ваш HTML (XML?) В дереве документа, которое по сути является более общей версией структуры данных, которую вы написали.

Затем вы можете перебрать сгенерированное дерево и обрезать его или перестроить другоедерево в памяти, которое выглядит так, как вы хотите.Но шаг HTML -> структура данных - это решенная проблема.


Подождите, вы хотите сгенерировать фактический код Python ?С какой стати ты этого хочешь?

3 голосов
/ 09 января 2011

Кстати, ваш код не будет делать то, что вы хотите:

class Play():
  acts = []
  ...
  def add_act(self, act): acts.append(act)

Попробуйте вместо этого:

class Play():
  def __init__(self):
    self.acts = []
  ...
  def add_act(self, act): 
    self.acts.append(act)
...