|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- import urllib.request
- from bs4 import BeautifulSoup
- import re
- def main():
- url='https://movie.douban.com/top250?start=' #基础网址
- data1=[] #输出的列表数据
- #1获取网站信息
- for i in range(10):
- url=url+str(i*25) #获取实际使用的网址
- html = get_html(url) #获得每一页的html
- data=jx(html) #把每一页需要的目标信息截取出来放在data里
- data1.append(data) #把每一页的目标信息组成的列表放入一个新的列表里
- return data1
- #3保存目标信息
- def get_html(url):
- headers={
- 'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 83.0.4103.106Safari / 537.36'
- }
- req=urllib.request.Request(url,headers=headers)
- response=urllib.request.urlopen(req)
- html=response.read().decode('utf-8')
- return html
- def jx(html):
- #使用BeautifulSoup解析html获得一个能直接使用正则表达式匹配的新文档
- soup=BeautifulSoup(html, 'html.parser')
- #创建获取目标信息的正则表达式规则
- findTitle=re.compile(r'<span class="title">(.*?)</span>')
- findBd=re.compile(r'<p class="">(.*?)</p>')
- findRating=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
- findRatingNumber=re.compile(r'<span>(.*?人评价)</span>')
- findlinl=re.compile(r'<a href="(.*?)" class="">')
- findimg=re.compile(r'<img width="100" alt="(?:.*?)" src="(.*?)" class="">')
- data=[] #初始化一个存放目标信息的列表
- # 因为每一页有25个电影,使用for循环获取每一个电影的目标信息
- for i in range(25):
- item=re.findall(findTitle,soup)
- #问题:我看教程上面item[i]要先转换成字符串,不懂求解
- data.append(str(item[i]))
- item = re.findall(findBd, soup)
- data.append(str(item[i]))
- item = re.findall(findRating, soup)
- data.append(str(item[i]))
- item = re.findall(findRatingNumber, soup)
- data.append(str(item[i]))
- item = re.findall(findlinl, soup)
- data.append(str(item[i]))
- item = re.findall(findimg, soup)
- data.append(str(item[i]))
- return data
- if __name__=='__main__':
- main()
复制代码
Traceback (most recent call last):
File "C:/Users/tiger/PycharmProjects/spider/test能否爬取.py", line 74, in <module>
main()
File "C:/Users/tiger/PycharmProjects/spider/test能否爬取.py", line 19, in main
data=jx(html) #把每一页需要的目标信息截取出来放在data里
File "C:/Users/tiger/PycharmProjects/spider/test能否爬取.py", line 49, in jx
item=re.findall(findTitle,soup)
File "C:\Users\tiger\Anaconda3\lib\re.py", line 223, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or bytes-like object
看完教程后自己试着写了下,大佬们:
1.这写的有什么问题
2.代码里有个提问麻烦解答下
- soup=BeautifulSoup(html, 'html.parser')
复制代码
这里用 decode 转成字符串就好了
- import urllib.request
- from bs4 import BeautifulSoup
- import re
- def get_html(url):
- headers={
- 'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 83.0.4103.106Safari / 537.36'
- }
- req=urllib.request.Request(url,headers=headers)
- response=urllib.request.urlopen(req)
- html=response.read().decode('utf-8')
- return html
- def jx(html):
- #使用BeautifulSoup解析html获得一个能直接使用正则表达式匹配的新文档
- soup=BeautifulSoup(html, 'html.parser').decode()
- #创建获取目标信息的正则表达式规则
- findTitle=re.compile(r'<span class="title">(.*?)</span>')
- findBd=re.compile(r'<p class="">(.*?)</p>')
- findRating=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
- findRatingNumber=re.compile(r'<span>(.*?人评价)</span>')
- findlinl=re.compile(r'<a href="(.*?)" class="">')
- findimg=re.compile(r'<img width="100" alt="(?:.*?)" src="(.*?)" class="">')
- data=[] #初始化一个存放目标信息的列表
- # 因为每一页有25个电影,使用for循环获取每一个电影的目标信息
- for i in range(25):
- item=re.findall(findTitle,soup)
- #问题1:我看教程上面item要先转换成字符串,不懂求解
- data.append(str(item))
- item = re.findall(findBd, soup)
- data.append(str(item))
- item = re.findall(findRating, soup)
- data.append(str(item))
- item = re.findall(findRatingNumber, soup)
- data.append(str(item))
- item = re.findall(findlinl, soup)
- data.append(str(item))
- item = re.findall(findimg, soup)
- data.append(str(item))
- return data
- def main():
- url='https://movie.douban.com/top250?start=' #基础网址
- data1=[] #输出的列表数据
- #1获取网站信息
- for i in range(10):
- url=url+str(i*25) #获取实际使用的网址
- html = get_html(url) #获得每一页的html
- data=jx(html) #把每一页需要的目标信息截取出来放在data里
- data1.append(data) #把每一页的目标信息组成的列表放入一个新的列表里
- return data1
- #3保存目标信息
- if __name__=='__main__':
- print(main())
复制代码
|
|