python--requests_html

这个模块从名字上也能看出来,是专门用来解析html的,这个和requests的作者是同一人,非常牛逼的一位大佬。

大致读了一下源码,总共一个py文件(但是引用了其他的模块),加上注释总共才700多行,大部分是基于已有的模块进行了一个二次封装,可以更加方便开发者去调用。

可以的话也推荐阅读一下源码,这样的代码最适合阅读,没有大型框架的代码量,但同时又包含了很多的知识点。因此可以将整个模块全部阅读,进而了解作者的构思,以及整个模块的原理

废话不多说,直接上代码

# 首先看一下requests_html下的HTMLSession这个类
from requests_html import HTMLSession

# 这个HTMLSession继承自requests模块下的Session类
session = HTMLSession()

# 毫无疑问,response.text会获取到相应的html页面,既然HTMLSession继承自requests下的Session,那么Session能实现的,HTMLSession都能实现
response = session.get("http://www.bilibili.com")
response.encoding = response.apparent_encoding

# 然而这个response可跟requests库下的Session.get(url)得到的response不一样
# 这个response要强大的多,response.html下面有很多的属性,先来看看它的功能是什么?
# 1.可以通过response.html.links获取html里面的路径(url),注意得到的是一个集合

for link in response.html.links:
    print(link)
    '''
    只截取一部分
    //www.bilibili.com/v/kichiku/guide/
    //www.bilibili.com/v/dance/demo/
    //www.bilibili.com/v/guochuang/puppetry/
    //www.bilibili.com/v/anime/finish/
    //www.bilibili.com/v/life/
    //live.bilibili.com/e-sports
    //www.bilibili.com/v/music/cover/
    '''

  

# 2.获取绝对路径

for link in response.html.absolute_links:
    print(link)
    '''
    只截取一部分
    https://www.bilibili.com/v/fashion/makeup/
    https://www.bilibili.com/v/dance/
    https://www.bilibili.com/v/kichiku/mad/
    https://www.bilibili.com/v/technology/speech_course/
    https://www.bilibili.com/v/music/oped/
    https://www.bilibili.com/v/ent/korea/    
    '''

  

# 3.实现CSS选择器

'''
response.html.find("#mmp", first=True)
查找id="mmp"的标签,如果加上first=True,那么会得到第一个标签。不加会得到所有的标签,这些标签会组合成一个列表返回

response.html.find(".mmp", first=True)
显然这个查找class="mmp"的标签

response.html.find("a", first=True)
找到a标签

当然还可以找p标签,div标签,span标签等等
'''
# 获取到的cls便是相应的标签
cls = response.html.find(".play", first=True)
print(cls)  # <Element 'p' class=('play',)>
# 这个cls下有很多方法
# 获取文本
print(cls.text)  # 播放:10.6万
# 获取属性
print(cls.attrs)  # {'class': ('play',)}
print(cls.attrs.get("class", None))  # ('play',)
# 获取所在的html
print(cls.html)  # <p class="play">播放:10.6万</p>

a = response.html.find("a", first=True)
print(a)  # <Element 'a' href='//www.bilibili.com' title='主站' class=('t',)>
print(a.text)  # 主站
print(a.attrs)  # {'href': '//www.bilibili.com', 'title': '主站', 'class': ('t',)}
print(a.attrs.get("href", None))  # //www.bilibili.com
'''
a.attrs.get("href", None)所获取的href感觉怪怪的,少了http:
不过不要紧,
    import webbrowser
    webbrowser.open(a.attrs.get("href", None))
因为我们使用webbrowser是可以打开的
'''
print(a.html)  # <a href="//www.bilibili.com" title="主站" class="t"><i class="bili-icon"/>主站</a>

# 我们知道response.html.links|absolute_links可以获取url,那么通过response.html.find获取到的标签依旧可以获取url
print(a.links)  # {'//www.bilibili.com'},得到的仍是个集合,哪怕集合里面只有一个元素

  

# 4.搜索文本。

'''
注意:response.html.text是搜索文本。比如<p>mmp</p>,那么得到的就是mmp。
而response.text,和requests.get(url).text或者request.Session().get(url).text一样,获取得到是整个HTML页面(这里就是<p>mmp>/p>)
'''
text = response.html.text
print(text)
'''
截取一部分,可以看到获取的是文本,也就是标签里的内容
主站
画友
音频
游戏中心
直播
会员购
BML
下载APP
投 稿
排行榜
首页
--
动画
MAD·AMV
MMD·3D
短片·手书·配音
综合
--
番剧
连载动画
完结动画
'''

  

# 5.搜索网页上的文本。不好说明,直接看例子吧

# 我们看到在获取文本的例子中,截取的结果的最后一个是"完结动画"
search_text = response.html.search("完{}画")[0]
print(search_text)  # 结动
search_text = response.html.search("完结{}")[0]
print(search_text)  # 动
# 如果不加[0],获取到的是一个<class 'parse.Result'>
print(response.html.search("完{}画"), ":::", type(response.html.search("完{}画")))  # <Result ('结动',) {}> ::: <class 'parse.Result'>
'''
可以看到还是很强大的,是用来在获取的全局的文本中搜索指定的文本
"完{}画",表示搜索开头是"完",结尾是"画"的中间的字段
但是当我指定"完结{}",并不会获取"动画"二字,而是只获取一个"动"字,对于英文也是一样,只会获取一个字符
如果获取不到满足条件的字符的话,比如response.html.search("完{}画cadadasdsa"),那么会返回None

而且这里有一个值得注意的点,那就是我获取"完结{}动画", "{}完结动画", "完结动画{}"会怎么样?
首先这里"完结动画"四个字已经全了,按理说{}已经获取不到内容了,但是
print(response.html.search("完结动画{}")[0])  # <,会得到这么一个东西,表示后面已经没有内容了
print(response.html.search("{}完结动画")[0])  # 会获取整个页面的html(含标签),
print(response.html.search("完结{}动画")[0])  # 动画</span></a></li><li>······uang/chinese/"><span>国产
如果补全的话应该是"(...完结)动画</span></a></li><li>······uang/chinese/"><span>国产(动画...)",
所以这种情况下回获取到"完结"和"动画"之间的html(含标签)
'''

  

# 6.之前说的选择器,也支持更复杂的选择

未完待续··········

猜你喜欢

转载自www.cnblogs.com/traditional/p/9638280.html
今日推荐