Какой элегантный способ получить аргументы для вызова playAudio из этого списка - PullRequest
1 голос
/ 03 февраля 2010

Я знаю, что это основной.

Мне просто интересно, каков элегантный способ сделать это.

Например:

Мне нужны строки 'python01.wav' и 'py * thon' из этого списка

Список выглядит так:

[
[('name', 'entry')],
[('class', 'entry')],
[('type', 'text/javascript'), ('src', '/term_added.php?hw=python')],
[('type', 'text/javascript')],
[('class', 'headword')],
[('class', 'hw')],
[],
[('class', 'pr')],
[('class', 'unicode')],
[('class', 'unicode')],
[('class', 'unicode')],
[('class', 'unicode')],
[],
[('href', '#'), ('onclick', "playAudio('python01.wav', 'py*thon'); return false;"), ('class', 'audio_link'), ('target', '_blank')],
[('src', '/images/audio.gif'), ('alt', 'Listen to audio'), ('title', 'Listen to audio')],
[],
[('class', 'fl')],
[],
[('class', 'in')],
[('class', 'il')],
[('class', 'if')],
[],
[('class', 'def')],
[('class', 'gram')],
[],
]

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

Возможно, не самое лучшее решение, но, кажется, делает то, что вы хотите:

l = [huge list from your example]
for e in l: # for each list
    for t in e: # for each tuple
        for s in t: # each string
            if 'playAudio' in s:
                args = s[9:].split(',') #skip 'playAudio' split on comma
                print "%s,%s" % (args[0].strip('('),
                                 args[1].lstrip(" ")[0:args[1].find(')')]

Я оставляю вам «оптимизировать» это упражнение. Если бы вы могли объяснить, откуда поступают эти данные и какие у них характеристики (может ли playAudio быть привязана только к вещам с атрибутом HREF?), Мы могли бы дать вам лучшее решение.

EDIT:

Лично для вашего конкретного примера я бы сделал это:

from BeautifulSoup import BeautifulSoup, SoupStrainer
import re
import urllib2

doc = urllib2.urlopen("http://www.learnersdictionary.com/search/python").read()
doc = doc.replace('</SCR', '')
audioLinks = SoupStrainer('a', onclick=re.compile(r'^playAudio'))
soup = [str(elm) for elm in BeautifulSoup(doc, parseOnlyThese=audio)]
for elm in soup:
    print re.search(r'playAudio\((.*[^)])\)', elm).group(1)
    # prints 'python01.wav', 'py*thon'
1 голос
/ 03 февраля 2010
return ('python01.wav', 'py*thon')

Это полностью соответствует вашим требованиям.

Но если бы мне пришлось угадывать, я не думаю, что это то, что вы хотите.

Так почему бы вам не дать нам достаточно информации, чтобы мы могли выяснить, какие строки вы хотите получить? Это все между одинарными кавычками в одной из строк? Все между одинарными кавычками, которые содержат буквы p,y,t,h,o,n в таком порядке? Аргументы для playAudio вызова?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...