Почему BeautifulSoup findAll возвращает пустой список, когда я ищу по классу? - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь отсканировать веб-страницы с помощью тега 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 ]

1 голос
/ 26 апреля 2019

Содержимое находится внутри 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

0 голосов
/ 26 апреля 2019

Ответ скрыт в двух элементах:

  1. рендеринг содержимого javascript: после document.onload
  2. , в частности, контент, управляемый js, следует за этим комментарием, и это действительно так.предоставлено JS.Строка, в которой начинается блок: «<! - -BEGIN ICIMS - ->» (пробел добавлен, чтобы избежать его пустоты)

Как вы можете себе представить, класс h2 = "класс ICISM здесь"НЕ существует, когда вы вызываете методы bs4.

Решение?ИМХО, лучший способ добиться того, чего вы хотите - это использовать селен, чтобы получить полностью отображаемую веб-страницу.

проверьте это также Соскребая веб-страницу JavaScript с Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...