【问题标题】:Why is BeautifulSoup's findAll returning an empty list when I search by class?当我按类搜索时,为什么 BeautifulSoup 的 findAll 返回一个空列表?
【发布时间】:2019-04-26 10:12:18
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

标签: python web-scraping beautifulsoup


【解决方案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)

【讨论】:

    【解决方案2】:

    答案隐藏在两个元素中:

    1. javascript 呈现的内容:在 document.onload 之后
    2. 特别是由js管理的内容出现在这条评论之后,并且确实是由js渲染的。块开始的行是:“”(添加空格以避免它变为空白)

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

    解决方案? 恕我直言,实现您想要的最佳方法是使用 selenium,以获得完整呈现的网页。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多