AttributeError: วัตถุ 'โมดูล' ไม่มีแอตทริบิวต์ 'urlopen'


146

ฉันพยายามใช้ Python เพื่อดาวน์โหลดซอร์สโค้ด HTML ของเว็บไซต์ แต่ฉันได้รับข้อผิดพลาดนี้

Traceback (most recent call last):  
    File "C:\Users\Sergio.Tapia\Documents\NetBeansProjects\DICParser\src\WebDownload.py", line 3, in <module>
     file = urllib.urlopen("http://www.python.org")
AttributeError: 'module' object has no attribute 'urlopen'

ฉันทำตามคำแนะนำที่นี่: http://www.boddie.org.uk/python/HTML.html

import urllib

file = urllib.urlopen("http://www.python.org")
s = file.read()
f.close()

#I'm guessing this would output the html source code?
print(s)

ฉันใช้ Python 3

คำตอบ:


245

สิ่งนี้ใช้ได้ใน Python 2.x

สำหรับ Python 3 ดูในเอกสาร :

import urllib.request

with urllib.request.urlopen("http://www.python.org") as url:
    s = url.read()
    # I'm guessing this would output the html source code ?
    print(s)

3
สวัสดี Eumiro ใช้คำสั่ง 'with' ใน Python ฉันเดาว่ามันจะปิดการเชื่อมต่อโดยอัตโนมัติเมื่อใช้งานเสร็จไหม คล้ายกับคำสั่งการใช้งานใน C #?

@Sergio: แน่นอน! และผ่านการเยื้องที่คุณเห็นว่าไฟล์ของคุณยังคงเปิดอยู่
eumiro

สวัสดี @ eumiro ฉันมีข้อผิดพลาดของ "IndentationError: คาดว่าบล็อกที่เยื้อง" เมื่อฉันพิมพ์s = url.read()ฉันจะขอให้ฉันแก้ไขได้อย่างไร x
Karen Chan

@KarenChan คุณกำลังขาดหายไปเยื้องก่อนs=url.read(); คุณมีช่องว่าง 4 ช่องมาก่อนหรือไม่
numbermaniac

19

โซลูชันที่รองรับ Python 2 + 3 คือ:

import sys

if sys.version_info[0] == 3:
    from urllib.request import urlopen
else:
    # Not Python 3 - today, it is most likely to be Python 2
    # But note that this might need an update when Python 4
    # might be around one day
    from urllib import urlopen


# Your code where you can use urlopen
with urlopen("http://www.python.org") as url:
    s = url.read()

print(s)

1
with urlopen("http://www.python.org") as url:ไม่ทำงานใน python2 AttributeError: addinfourl instance has no attribute '__exit__'กับ ต้องเขียนurl = urlopen("http://www.python.org")
orshachar

15
import urllib.request as ur
s = ur.urlopen("http://www.google.com")
sl = s.read()
print(sl)

ใน Python v3 "urllib.request" เป็นโมดูลด้วยตัวเองดังนั้นจึงไม่สามารถใช้ "urllib" ได้ที่นี่


7

ในการรับ ' dataX = urllib.urlopen (url) .read () ' ทำงานใน python 3 (สิ่งนี้จะถูกต้องสำหรับ python 2 )คุณต้องเปลี่ยน 2 สิ่งเล็กน้อย

1:คำสั่ง urllib (เพิ่ม .request ที่ตรงกลาง):

dataX = urllib.request.urlopen(url).read()

2:คำสั่งการนำเข้าก่อนหน้า (เปลี่ยนจาก 'import urlib' เป็น:

import urllib.request

และควรทำงานใน python3 :)




1

โซลูชันสำหรับ python3:

from urllib.request import urlopen

url = 'http://www.python.org'
file = urlopen(url)
html = file.read()
print(html)

ง่ายและเข้าใจง่ายสำหรับผู้เริ่มต้น ขอบคุณ
SHR

1

เปลี่ยนสองบรรทัด:

import urllib.request #line1

#Replace
urllib.urlopen("http://www.python.org")
#To
urllib.request.urlopen("http://www.python.org") #line2

หากคุณได้รับข้อผิดพลาด 403: ข้อยกเว้นข้อผิดพลาดต้องห้ามลองสิ่งนี้:

siteurl = "http://www.python.org"

req = urllib.request.Request(siteurl, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'})
pageHTML = urllib.request.urlopen(req).read()

ฉันหวังว่าปัญหาของคุณจะได้รับการแก้ไข


0

หนึ่งในวิธีที่เป็นไปได้ที่จะทำ:

import urllib
...

try:
    # Python 2
    from urllib2 import urlopen
except ImportError:
    # Python 3
    from urllib.request import urlopen

0

ใช้หกโมดูลเพื่อให้โค้ดของคุณใช้งานร่วมกันได้ระหว่างpython2และpython3

urllib.request.urlopen("<your-url>")```

คุณสามารถนำเข้าหกโมดูลด้วยวิธีนี้ได้จาก six.move import urllib
Rajat Shukla

0

รหัสของคุณที่ใช้ใน python2.x คุณสามารถใช้ดังนี้:

from urllib.request import urlopen
urlopen(url)

โดยวิธีการแนะนำโมดูลอื่นที่เรียกว่าrequestsเป็นมิตรกับการใช้คุณสามารถใช้pipติดตั้งและใช้เช่นนี้:

import requests
requests.get(url)
requests.post(url)

ฉันคิดว่ามันใช้งานง่ายฉันเป็นมือใหม่ด้วย .... ฮ่าฮ่า


-1
import urllib
import urllib.request
from bs4 import BeautifulSoup


with urllib.request.urlopen("http://www.newegg.com/") as url:
    s = url.read()
    print(s)
soup = BeautifulSoup(s, "html.parser")
all_tag_a = soup.find_all("a", limit=10)

for links in all_tag_a:
    #print(links.get('href'))
    print(links)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.