li7yue 发表于 2020-6-21 18:12:51

关于beautifulsoup的几个初级问题

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

import urllib.request
import re
from bs4 import BeautifulSoup

def 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'
    response = urllib.request.urlopen(url)
    html = response.read()
    soup = BeautifulSoup(html, 'html.parser')

    princess = dict()



    i = 0
    for each in soup.find_all(href=re.compile('pcr')):
      # print(i)
      # print(each['href'])
      print(urllib.parse.unquote((each['href'].split('/', 2))))
      # i += 1
      princess = .split('/', 2))),'none']
      i += 1

    print('-------------------------------------------------------------')

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

if __name__ == '__main__':
    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好用,直接用别人的代码也是感觉非常好用,但是自己懵的很.... 求大佬帮忙优化代码, 或者给一些解释和意见, 或者推荐点可以自学的方向或者内容

万分谢谢

Twilight6 发表于 2020-6-21 18:21:07



哈哈 我最近也有看这部番{:10_297:}

liuzhengyuan 发表于 2020-6-21 18:21:56

本帖最后由 liuzhengyuan 于 2020-6-21 18:24 编辑

你是要爬取图片地址吗?

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

from requests import get
import re

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")
html = res.text

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

for i in lst:
    print(i)

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

第 7 行开始匹配
字符串中的小括号中是要匹配的地址,因为每个地址不一样,所以用 .+? 表示
"Icon unit \d+?.png"
这个是为了更精确的匹配

li7yue 发表于 2020-6-23 18:34:21

liuzhengyuan 发表于 2020-6-21 18:21
你是要爬取图片地址吗?

其实这个 bs4 不好爬的


收到,感谢,看来也要灵活应用正则表达式啊

li7yue 发表于 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()进行转化完使用
页: [1]
查看完整版本: 关于beautifulsoup的几个初级问题