Выскабливание английских слов с использованием Python - PullRequest
3 голосов
/ 21 июня 2011

Я хотел бы вычеркнуть все английские слова, скажем, с первой страницы New York Times.Я написал что-то вроде этого в Python:

import re
from urllib import FancyURLopener

class MyOpener(FancyURLopener):
    version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'            

opener = MyOpener()
url = "http://www.nytimes.com"
h = opener.open(url)
content = h.read()
tokens = re.findall("\s*(\w*)\s*", content, re.UNICODE) 
print tokens

Это хорошо работает, но я получаю ключевые слова HTML, такие как "img", "src", а также английские слова.Есть ли простой способ получить только английские слова из веб-scaping / HTML?

Я видел этот пост, кажется, он говорит только о механизме очистки, ни один из упомянутых инструментов не говорит о том, как отфильтровать неязыковые элементы.Меня не интересуют ссылки, форматирование и т. Д. Просто простые слова.Любая помощь будет оценена.

Ответы [ 5 ]

4 голосов
/ 21 июня 2011

Вы уверены, что хотите «английские» слова - в том смысле, что они появляются в каком-то словаре?Например, если вы удалили статью из Нью-Йорк Таймса, хотели бы вы включить «Обаму» (или «Пэйлин» для вас, Blue-Staters), даже если они, вероятно, еще не представлены ни в одном словаре?

Во многих случаях лучше анализировать HTML (используя BeautifulSoup, как предлагает Брайан) и включать только текстовые узлы (и, возможно, некоторые атрибуты, нацеленные на людей, такие как "title" и "alt").

1 голос
/ 21 июня 2011

Html2Text может быть хорошим вариантом.

import html2text

print html2text.html2text (your_html_string)

1 голос
/ 21 июня 2011

Вам понадобится какая-то ссылка на словарь английского языка.Простой способ сделать это - использовать проверку орфографии. PyEnchant приходит на ум.

С сайта PyEnchant:

>>> import enchant
>>> d = enchant.Dict("en_US")
>>> d.check("Hello")
True
>>> d.check("Helo")
False
>>>

В вашем случае, возможно, что-то вроде:

d = enchant.Dict("en_US")
english_words = [tok for tok in tokens if d.check(tok)]

Если этого недостаточно, и вам не нужны «английские слова», которые могут появляться в теге HTML (например, в атрибуте), вы, вероятно, можете использовать BeautifulSoup для анализа только важного текста.

0 голосов
/ 21 июня 2011

Вы можете заменить все <. *> Ничем или пробелом.Используйте модуль re и убедитесь, что вы понимаете жадное и не жадное сопоставление с образцом.Вам нужен не жадный для этого.

Затем, как только вы удалите все теги, примените стратегию, которую использовали.

0 голосов
/ 21 июня 2011

Мне нравится использовать библиотеку lxml для этого:

# copypasta from http://lxml.de/lxmlhtml.html#examples
import urllib
from lxml.html import fromstring
url = 'http://microformats.org/'
content = urllib.urlopen(url).read()
doc = fromstring(content)
els = el.find_class(class_name)
if els:
    return els[0].text_content()

Затем, чтобы убедиться, что выделенные слова - это только английские слова, вы можете использовать их для поиска в словаре, который вы загружаете из текстового файла, или NLTK , который поставляется со многими классными инструментами для обработки корпусов и языков.

...