Как писать в файл не на английском языке, используя BeautifulSoup - PullRequest
0 голосов
/ 29 мая 2018

Я изучаю webscraping через BeautifulSoup и Python.Мой первый проект - извлечь определенные рецепты из cookpad.hu.Мне удалось извлечь, но теперь у меня проблемы с записью их в файл (csv - это все, что я умею делать) из-за этой ошибки:

Traceback (последний вызовпоследнее): файл «cookpad_scrape.py», строка 24, в f.writerow (about_clean) UnicodeEncodeError: кодек «ascii» не может кодировать символ u '\ xe1' в позиции 0: порядковый номер не находится в диапазоне (128)

Мой код указан ниже.Я использую Python 2.7.14 на Ubuntu.Пастбин веб-страницы здесь , но сама веб-страница это .

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

import requests
from bs4 import BeautifulSoup 
import csv 

'''
Tree of page:
    <div id="recipe main">
        <div id="editor" class="editor">
            <div id="about">
            <section id="ingredients">
            <section id="steps">
'''
#text only: soup.get_text()

page = requests.get('https://cookpad.com/hu/receptek/5040119-parazson-sult-padlizsankrem')
soup = BeautifulSoup(page.text, 'lxml')

f = csv.writer(open('recipes.csv', 'w')) #create and open file in f variable, using 'w' mode
f.writerow(['Recipe 1']) #write top row headings

about = soup.find(id='about')
about_ext = about.p.extract()
about_clean = about_ext.get_text()
f.writerow(about_clean)

ingredients = soup.find(id='ingredients')
ingredients_ext = ingredients.ol.extract()
ingredients_clean = ingredients_ext.find_all(itemprop='ingredients')
#for ingredient in ingredients_clean:

steps = soup.find(id='steps')
steps_p = steps.find_all(itemprop='recipeInstructions')
for step in steps_p:
    extracted = step.p.extract()
    print(extracted.text)
    f.writerow([extracted])

Решение: Запустите сценарий, используя python3, а не 2 через python3 my_script.py

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

1 Ответ

0 голосов
/ 30 мая 2018

Вы используете Python2.В строке 25 вы записываете содержимое переменной about_clean.Вам необходимо закодировать это значение.

f.writerow(about_clean.encode("utf-8"))
...