Разбор Python HTML с красивым супом и фильтрацией стоп-слов - PullRequest
1 голос
/ 12 апреля 2011

Я анализирую конкретную информацию с веб-сайта в файл. Прямо сейчас у меня есть программа, которая просматривает веб-страницу, находит правильный HTML-тег и анализирует правильное содержимое. Теперь я хочу дополнительно отфильтровать эти «результаты».

Например, на сайте: http://allrecipes.com/Recipe/Slow-Cooker-Pork-Chops-II/Detail.aspx

Я анализирую ингредиенты, которые находятся в теге

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

Когда я запускаю этот парсер, он удаляет цифры, символы, запятые и косую черту (\ или /), но оставляет весь текст. Когда я запускаю его на веб-сайте, я получаю следующие результаты:

cup olive oil
cup chicken broth
cloves garlic minced
tablespoon paprika

Теперь я хочу еще больше обработать это, удалив такие стоповые слова, как «чашка», «гвоздика», «фарш», «скатерть» среди других. Как именно я это делаю? Этот код написан на python, и я не очень хорош в этом, и я просто использую этот парсер для получения информации, которую я могу ввести вручную, но я бы не хотел.

Буду признателен за любую помощь в том, как сделать это подробно! Мой код ниже: как бы я это сделал?

Код:

import urllib2
import BeautifulSoup

def main():
    url = "http://allrecipes.com/Recipe/Slow-Cooker-Pork-Chops-II/Detail.aspx"
    data = urllib2.urlopen(url).read()
    bs = BeautifulSoup.BeautifulSoup(data)

    ingreds = bs.find('div', {'class': 'ingredients'})
    ingreds = [s.getText().strip('123456789.,/\ ') for s in ingreds.findAll('li')]

    fname = 'PorkRecipe.txt'
    with open(fname, 'w') as outf:
        outf.write('\n'.join(ingreds))

if __name__=="__main__":
    main()

1 Ответ

2 голосов
/ 12 апреля 2011
import urllib2
import BeautifulSoup
import string

badwords = set([
    'cup','cups',
    'clove','cloves',
    'tsp','teaspoon','teaspoons',
    'tbsp','tablespoon','tablespoons',
    'minced'
])

def cleanIngred(s):
    # remove leading and trailing whitespace
    s = s.strip()
    # remove numbers and punctuation in the string
    s = s.strip(string.digits + string.punctuation)
    # remove unwanted words
    return ' '.join(word for word in s.split() if not word in badwords)

def main():
    url = "http://allrecipes.com/Recipe/Slow-Cooker-Pork-Chops-II/Detail.aspx"
    data = urllib2.urlopen(url).read()
    bs = BeautifulSoup.BeautifulSoup(data)

    ingreds = bs.find('div', {'class': 'ingredients'})
    ingreds = [cleanIngred(s.getText()) for s in ingreds.findAll('li')]

    fname = 'PorkRecipe.txt'
    with open(fname, 'w') as outf:
        outf.write('\n'.join(ingreds))

if __name__=="__main__":
    main()

результат в

olive oil
chicken broth
garlic,
paprika
garlic powder
poultry seasoning
dried oregano
dried basil
thick cut boneless pork chops
salt and pepper to taste

? Я не знаю, почему в нем оставлена ​​запятая - s.strip (string.punctuation) должен был позаботиться об этом.

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