TypeError: बाइट्स जैसी ऑब्जेक्ट पर एक स्ट्रिंग पैटर्न का उपयोग re.findall () में नहीं कर सकता


107

मैं यह जानने की कोशिश कर रहा हूं कि एक पृष्ठ से स्वचालित रूप से url कैसे प्राप्त करें। निम्नलिखित कोड में मैं वेबपेज का शीर्षक पाने की कोशिश कर रहा हूं:

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

मैं क्या गलत कर रहा हूं?


1
संभव बाइट्स
gnat

जवाबों:



28

समस्या यह है कि आपके रेगुलर एक्सप्रेशन से एक स्ट्रिंग है, लेकिन है 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प्रलेखन अधिक जानकारी के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.