Bash/Python: открытый URL и печать топ-10 слов

Мне нужно извлечь 10 наиболее часто встречающихся слов из текста, используя конвейер (и любые дополнительные скрипты Python по мере необходимости); выводом является блок всех заглавных букв, разделенных пробелом. Этот канал должен извлекать текст из любого внешнего файла: мне удалось заставить его работать с файлами.txt, но я также должен иметь возможность ввести URL-адрес и сделать то же самое с этим.

У меня есть следующий код:

alias words="tr a-zA-Z | tr -cs A-Z | tr ' ' '\012' | sort -n | uniq -c | 
sort -r | head -n 10 | awk '{printf \"%s \", \$2}END{print \"\"}'" (on one line)

который, с cat hamlet.txt | words дает мне:

TO THE AND A  'TIS THAT OR OF IS

Чтобы сделать его более сложным, мне нужно исключить любые слова "функции": это "нелексические" слова, такие как "a", "the", "of", "is", любые местоимения (я, ты, он) и любые предлоги (там, в, из).

Мне нужно уметь печатать htmlstrip http://www.google.com.au | words и распечатайте его, как указано выше.

Для открытия URL: скрипт Python, который я пытаюсь выяснить (назовем его htmlstrip), удаляет любые теги из текста, оставляя только "читаемый человеком" текст. Это должно быть в состоянии открыть любой данный URL, но я не могу понять, как заставить это работать. Что у меня так далеко:

import re
import urllib2
filename = raw_input('File name: ')
filehandle = open(filename)
html = filehandle.read()

f = urllib2.urlopen('http://') #???
print f.read()

text = [ ]
inTag = False


for ch in html:
    if ch == '<':
        inTag = True
    if not inTag:
        text.append(ch)
    if ch == '>':
        inTag = False

print ''.join(text)

Я знаю, что это и неполно, и, вероятно, неправильно - любое руководство действительно будет оценено.

3 ответа

Решение

Вы можете использовать scrape.py и регулярные выражения, как это:

#!/usr/bin/env python

from scrape import s
import sys, re

if len(sys.argv) < 2:
    print "Usage: words.py url"
    sys.exit(0)

s.go(sys.argv[1]) # fetch content
text = s.doc.text # extract readable text
text = re.sub("\W+", " ", text) # remove all non-word characters and repeating whitespace
print text

А потом просто:./words.py http://whatever.com

ОБНОВЛЕНИЕ: Извините, просто прочитайте комментарий о чистом Python без каких-либо дополнительных модулей. Да, в этой ситуации re, Думаю, будет лучшим способом.

Может быть, это будет проще и правильнее использовать pycURL а не удалять теги re?

from StringIO import StringIO    
import pycurl

url = 'http://www.google.com/'

storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.WRITEFUNCTION, storage.write)
c.perform()
c.close()
content = storage.getvalue()
print content

Использование re.sub за это:

import re

text = re.sub(r"<.+>", " ", html)

Для особых случаев, таких как сценарии, вы можете включить регулярное выражение, например:

<script.*>.*</script>
Другие вопросы по тегам