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>