当我按班级搜索时,BeautifulSoup的findAll为什么返回一个空列表?

时间:2019-04-25 22:53:27

标签: python web-scraping beautifulsoup

我正在尝试使用h2标签进行网页抓取,但是BeautifulSoup返回了一个空列表。

<h2 class="iCIMS_InfoMsg iCIMS_InfoField_Job">

html=urlopen("https://careersus-endologix.icims.com/jobs/2034/associate-supplier-quality-engineer/job")
bs0bj=BeautifulSoup(html,"lxml")
nameList=bs0bj.findAll("h2",{"class":"iCIMS_InfoMsg iCIMS_InfoField_Job"})
print(nameList)

2 个答案:

答案 0 :(得分:1)

内容位于iframe中,并通过js更新(因此在初始请求中不存在)。您可以使用页面用于获取iframe内容的同一链接(iframe src)。然后从具有信息的脚本标签中提取字符串,并加载json,提取description(即html),然后传递回bs,然后选择h2标签。现在,如果需要,您现在还将剩余的信息存储在第二个汤对象中。

import requests
from bs4 import BeautifulSoup as bs
import json

r = requests.get('https://careersus-endologix.icims.com/jobs/2034/associate-supplier-quality-engineer/job?mobile=false&width=1140&height=500&bga=true&needsRedirect=false&jan1offset=0&jun1offset=60&in_iframe=1')
soup = bs(r.content, 'lxml')
script = soup.select_one('[type="application/ld+json"]').text
data = json.loads(script)
soup = bs(data['description'], 'lxml')
headers = [item.text for item in soup.select('h2')]
print(headers)

enter image description here

答案 1 :(得分:0)

答案隐藏在两个元素中:

  1. javascript呈现的内容:document.onload之后
  2. 尤其是由js管理的内容在此注释之后,并且确实由js呈现。块开始的行是:“ <!--BEGIN ICIMS-->”(添加空格以避免空白)

您可以想象,当您调用bs4方法时,h2 class =“ ICISM class here”不存在。

解决方案? 恕我直言,实现所需目标的最佳方法是使用硒,以获得完整的渲染网页。

也检查一下 Web-scraping JavaScript page with Python