Парсинг сайта BeautifulSoup - Python

Узнай цену своей работы

Формулировка задачи:

Самостоятельно занимаюсь изучением языка Python. Решил написать примитивный парсер сайта, используя библиотеку BeautifulSoup, мало того это код из видеоурока.
Листинг программы
  1. # -*- coding: utf-8 -*-
  2. import urllib.request
  3. from bs4 import BeautifulSoup
  4.  
  5. def get_html(url):
  6. response = urllib.request.urlopen(url)
  7. return response.read()
  8. def parse(html):
  9. soup = BeautifulSoup(html, 'html.parser')
  10. table = soup.find('div', {"class": "Search-result-item"})
  11. print(table)
  12. def main():
  13. parse(get_html('https://www.fabrikant.ru/trades/procedure/search/'))
  14. if __name__ == "__main__":
  15. main()
и получаю такой эксепт:
Листинг программы
  1. Traceback (most recent call last):
  2. File "D:\python\Parser\Parser.py", line 19, in <module>
  3. main()
  4. File "D:\python\Parser\Parser.py", line 16, in main
  5. parse(get_html('https://www.fabrikant.ru/trades/procedure/search/'))
  6. File "D:\python\Parser\Parser.py", line 13, in parse
  7. print(table)
  8. File "C:\Users\UN\AppData\Local\Programs\Python\Python35-32\lib\encodings
  9. \cp866.py", line 19, in encode
  10. return codecs.charmap_encode(input,self.errors,encoding_map)[0]
  11. UnicodeEncodeError: 'charmap' codec can't encode character '\xab' in position 33
  12. 7: character maps to <undefined>
Понятно что, что то с кодировкой, но не ясно, как победить, гугл не дал результатов.

UPD: Пока сам придумал обходной маневр обозвав переменную str типом данных.

Решение задачи: «Парсинг сайта BeautifulSoup»

textual
Листинг программы
  1. # -*- coding: utf-8 -*-
  2. import urllib.request
  3. from bs4 import BeautifulSoup
  4. import premailer
  5. import logging
  6.  
  7.  
  8. def get_html(url):
  9.     response = urllib.request.urlopen(url)
  10.     return response.read()
  11.  
  12.  
  13. def parse(html):
  14.     soup = BeautifulSoup(html, 'html.parser')
  15.     head = soup.find('head')
  16.     table = soup.find('div', {"class": "Search-list"})
  17.  
  18.     result_html = premailer.Premailer('<html>' + str(head) + '<body>' + str(table) + '</body></html>',
  19.                                       cssutils_logging_level=logging.CRITICAL).transform()
  20.     with open('result.html', 'w') as f_obj_out:
  21.         f_obj_out.write(result_html)
  22.  
  23.     send_mail()
  24.  
  25.  
  26. def send_mail():
  27.     import smtplib
  28.     from email.mime.multipart import MIMEMultipart
  29.     from email.mime.text import MIMEText
  30.  
  31.     fromaddr = "your_gmail_account"
  32.     toaddr = "address_to_send_to"
  33.     mypass = "your_gmail_password"
  34.  
  35.     msg = MIMEMultipart()
  36.     msg['From'] = fromaddr
  37.     msg['To'] = toaddr
  38.     msg['Subject'] = "your_desired_subject"
  39.  
  40.     with open('result.html') as f_obj:
  41.         body = f_obj.read()
  42.  
  43.     msg.attach(MIMEText(body, 'html'))
  44.  
  45.     server = smtplib.SMTP('smtp.gmail.com', 587)
  46.     server.starttls()
  47.     server.login(fromaddr, mypass)
  48.     text = msg.as_string()
  49.     server.sendmail(fromaddr, toaddr, text)
  50.     server.quit()
  51.  
  52.  
  53. def main():
  54.     parse(get_html('https://www.fabrikant.ru/trades/procedure/search/'))
  55.  
  56.  
  57. if __name__ == "__main__":
  58.     main()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут