首页 > 编程语言 > 详细

在用BeautifulSoup解析HTML前对其中以JavaScript渲染部分的处理

时间:2019-04-03 22:43:26      阅读:245      评论:0      收藏:0      [点我收藏+]

现在不少网站的内容在JavaScript的代码中,为了能让我们看到其中的内容,浏览器会对JavaScript代码进行渲染,得到其中的内容后再呈现到我们面前。然而,当我们需要对网站进行文本或数据收集的时候,我们往往不使用浏览器,而是通过爬虫程序。显然,爬虫程序不同于一般的浏览器,能自动或默认地对HTML文件中的JavaScript代码进行渲染。因此,如果我们的目标镶嵌在JavaScript中,那么我们爬到的数据往往就会缺少了我们的目标。

 

解决这个问题大致有两种方案:一是直接(或显示)地模拟浏览器的行为,比如用Selenium模块,该模块就提供了返回渲染后HTML文本的功能;显然,第二种方法就是隐式渲染,我们不会看到浏览器被打开,链接被打开等等一系列的行为,但代码运行后最终也能得到渲染后的结果。现在主要介绍一下第二种方法。相比于比较笨重的Selenium,这种方法会用到一个轻量级的HTML解析模块:requests-html。

 

安装

安装比较简单,在命令行运行:

pip install requests-html
或者
pip3 install requests-html

即可安装该模块。

 

运用

requests-html提供了渲染JavaScript的方法:render,示例如下:

from requests_html import HTMLSession
from bs4 import BeautifulSoup

session = HTMLSession()

first_page = session.get(https://sou.zhaopin.com/?jl=763&kw=%E7%88%AC%E8%99%AB%E5%B7%A5%E7%A8%8B%E5%B8%88&kt=3)
first_page.html.render(sleep=5)

soup = BeautifulSoup(first_page.html.html, "lxml") 
# 经试验,需要使用"lxml"解析器才能让BeautifulSoup正确解析渲染后的JavaScript中的内容 ls
= soup.find_all(class_="contentpile__content__wrapper__item__info__box__job__saray") with open("result.txt", "w") as f: for item in ls: f.write(str(item) + \n)

注意到,render后有一个sleep参数,目的是为了在进行下一步(即BeautifulSoup解析渲染后的HTML)之前,充分渲染网页,得到完全渲染后的结果。经试验,如果不给予充足的时间渲染,可能不会找到目标标签。

 

关于requests-html的其他详细用法还请参考https://html.python-requests.org/

在用BeautifulSoup解析HTML前对其中以JavaScript渲染部分的处理

原文:https://www.cnblogs.com/tspeaking/p/10651985.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!