鱼C论坛

 找回密码
 立即注册
查看: 1186|回复: 4

[已解决]关于beautifulsoup的几个初级问题

[复制链接]
发表于 2020-6-21 18:12:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看了半天,beautifulsoup,最后还是似懂非懂
尝试用beautifulsoup爬点最近玩的手游的小icon,写了以下编码

  1. import urllib.request
  2. import re
  3. from bs4 import BeautifulSoup

  4. def main():
  5.     url = r'https://wiki.biligame.com/pcr/%E9%98%B5%E8%90%A5%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A'
  6.     response = urllib.request.urlopen(url)
  7.     html = response.read()
  8.     soup = BeautifulSoup(html, 'html.parser')

  9.     princess = dict()



  10.     i = 0
  11.     for each in soup.find_all(href=re.compile('pcr'))[41:86]:
  12.         # print(i)
  13.         # print(each['href'])
  14.         print(urllib.parse.unquote((each['href'].split('/', 2)[2])))
  15.         # i += 1
  16.         princess[i] = [urllib.parse.unquote((each['href'].split('/', 2)[2])),'none']
  17.         i += 1

  18.     print('-------------------------------------------------------------')

  19.     i = 0
  20.     for each in soup.find_all(src=re.compile('Icon_unit')):
  21.         print(each['src'])
  22.         princess[i][1] = each['src']
  23.         i += 1

  24. if __name__ == '__main__':
  25.     main()
复制代码


主要就是从:url = r'https://wiki.biligame.com/pcr/%E9%98%B5%E8%90%A5%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A'
这个小页面 爬一每个角色的名字和角色icon图的下载地址

但是问题来了,我觉得自己写的很蠢,查找关键内容的精度不够,导致需要用很笨的方法重新筛选内容

以及有以下几个问题希望大佬帮助:
find_all(href=re.compile('pcr')的意思是找到所有href=后面有pcr关键词的string?
然后each in soup.find_all的each 类型是个tag,这个tag是个什么类型?是说可以通过each['src']找到所有以src开头的内容?

都说beautifulsoup好用,直接用别人的代码也是感觉非常好用,但是自己懵的很.... 求大佬帮忙优化代码, 或者给一些解释和意见, 或者推荐点可以自学的方向或者内容

万分谢谢
最佳答案
2020-6-21 18:21:56
本帖最后由 liuzhengyuan 于 2020-6-21 18:24 编辑

你是要爬取图片地址吗?

其实这个 bs4 不好爬的
我做了个正则版的,几行搞定!

  1. from requests import get
  2. import re

  3. res = get("https://wiki.biligame.com/pcr/%E9%98%B5%E8%90%A5%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A")
  4. html = res.text

  5. s = re.compile(r'<img alt="Icon unit \d+?.png" src="(.+?)"')
  6. lst = s.findall(html)

  7. for i in lst:
  8.     print(i)
复制代码


解释一下:
前几行获取网页源代码(html为获得的源代码)

第 7 行开始匹配
字符串中的小括号中是要匹配的地址,因为每个地址不一样,所以用 .+? 表示
"Icon unit \d+?.png"
这个是为了更精确的匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-21 18:21:07 | 显示全部楼层


哈哈 我最近也有看这部番
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-21 18:21:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 liuzhengyuan 于 2020-6-21 18:24 编辑

你是要爬取图片地址吗?

其实这个 bs4 不好爬的
我做了个正则版的,几行搞定!

  1. from requests import get
  2. import re

  3. res = get("https://wiki.biligame.com/pcr/%E9%98%B5%E8%90%A5%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A")
  4. html = res.text

  5. s = re.compile(r'<img alt="Icon unit \d+?.png" src="(.+?)"')
  6. lst = s.findall(html)

  7. for i in lst:
  8.     print(i)
复制代码


解释一下:
前几行获取网页源代码(html为获得的源代码)

第 7 行开始匹配
字符串中的小括号中是要匹配的地址,因为每个地址不一样,所以用 .+? 表示
"Icon unit \d+?.png"
这个是为了更精确的匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 18:34:21 | 显示全部楼层
liuzhengyuan 发表于 2020-6-21 18:21
你是要爬取图片地址吗?

其实这个 bs4 不好爬的

收到,感谢,看来也要灵活应用正则表达式啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 18:42:31 | 显示全部楼层
自己举例补充一下,也是作为记录
例子:
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
tag.name -> b 这个是的名字
tag.attrs -> {'class':['boldest'] 这个是属性,一个tag可能有很多属性,以字典形式储存

tag.string -> Extremely bold 这是一个navigable string,如果想在bs外面使用,需要用str()进行转化完使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 16:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表