প্রকারের ত্রুটি: পুনঃফাইন্ডল () এ বাইটের মতো অবজেক্টে স্ট্রিং প্যাটার্ন ব্যবহার করতে পারে না


107

আমি কীভাবে কোনও পৃষ্ঠা থেকে ইউআরএল আনব তা শিখার চেষ্টা করছি। নিম্নলিখিত কোডে আমি ওয়েবপৃষ্ঠার শিরোনাম পাওয়ার চেষ্টা করছি:

import urllib.request
import re

url = "http://www.google.com"
regex = r'<title>(,+?)</title>'
pattern  = re.compile(regex)

with urllib.request.urlopen(url) as response:
   html = response.read()

title = re.findall(pattern, html)
print(title)

এবং আমি এই অপ্রত্যাশিত ত্রুটি পেয়েছি:

Traceback (most recent call last):
  File "path\to\file\Crawler.py", line 11, in <module>
    title = re.findall(pattern, html)
  File "C:\Python33\lib\re.py", line 201, in findall
    return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object

আমি কি ভুল করছি?


উত্তর:



28

সমস্যা হল আপনার Regex একটি স্ট্রিং, কিন্তু htmlহয় বাইট :

>>> type(html)
<class 'bytes'>

যেহেতু পাইথন জানে না যে কীভাবে এই বাইটগুলি এনকোড করা হয়েছে, সুতরাং আপনি যখন তাদের উপর স্ট্রিং রেজেক্স ব্যবহার করার চেষ্টা করবেন তখন এটি একটি ব্যতিক্রম ছুঁড়ে দেয়।

আপনি হয় decodeস্ট্রিংয়ের বাইটগুলি:

html = html.decode('ISO-8859-1')  # encoding may vary!
title = re.findall(pattern, html)  # no more error

বা বাইটস রেজেক্স ব্যবহার করুন:

regex = rb'<title>(,+?)</title>'
#        ^

এই নির্দিষ্ট প্রসঙ্গে আপনি প্রতিক্রিয়া শিরোনাম থেকে এনকোডিং পেতে পারেন:

with urllib.request.urlopen(url) as response:
    encoding = response.info().get_param('charset', 'utf8')
    html = response.read().decode(encoding)

আরও বিশদ জন্য urlopenডকুমেন্টেশন দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.