Как я могу скинуть названия профессий с этой страницы javascript, используя Python - PullRequest
0 голосов
/ 14 января 2020

Как я могу вычеркнуть названия профессий с этой страницы javascript, используя Python?

'https://www.dice.com/career-paths?title=PHP%2BDeveloper&location=San%2BDiego,% 2BCalifornia,% 2BU,% 2BCA & опыт = 0 & sortBy = mostProbableTransition '

Это мой фрагмент кода, в возвращенном супе нет нужных текстовых данных!

import requests
from bs4 import BeautifulSoup
import json
import re
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# get BeautifulSoup object
def get_soup(url):
    """
    This function returns the BeautifulSoup object.

    Parameters:
        url: the link to get soup object for

    Returns:
        soup: BeautifulSoup object
    """
    req = requests.get(url)
    soup = BeautifulSoup(req.text, 'html.parser')
    return soup

# get selenium driver object
def get_selenium_driver():
    """
    This function returns the selenium driver object.

    Parameters:
        None

    Returns:
        driver: selenium driver object
    """
    options = webdriver.FirefoxOptions()
    options.add_argument('-headless')

    driver = webdriver.Firefox(executable_path=r"geckodriver", firefox_options = options)

    return driver

# get soup obj using selenium
def get_soup_using_selenium(url):
    """
    Given the url of a page, this function returns the soup object.

    Parameters:
        url: the link to get soup object for

    Returns:
        soup: soup object
    """
    options = webdriver.FirefoxOptions()
    options.add_argument('-headless')

    driver = webdriver.Firefox(executable_path=r"geckodriver", firefox_options = options)
    driver.get(url)
    driver.implicitly_wait(3)

    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')

    driver.close()

    return soup




title = "PHP%2BDeveloper"
location = "San%2BDiego,%2BCalifornia,%2BUs,%2BCA"
years_of_experirence = "0"
sort_by_filter = "mostProbableTransition"

url = "https://www.dice.com/career-paths?title={}&location={}&experience={}&sortBy={}".format(title, location, years_of_experirence , sort_by_filter)
career_paths_page_soup = get_soup(url)

1 Ответ

0 голосов
/ 14 января 2020

Как другой пользователь упомянул в комментариях, requests здесь не подойдет. Но, используя Selenium, вы можете очистить содержимое страницы, используя WebDriverWait, чтобы убедиться, что все содержимое страницы загружено, и element.text, чтобы извлечь содержимое веб-страницы.

Следующий фрагмент кода напечатает строки пути карьеры в левой части страницы:

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# navigate to the page
driver = get_selenium_driver()
driver.get(url)

# wait for loading indicator to be hidden
WebDriverWait(driver, 10).until(EC.invisibility_of_element((By.XPATH, "//*[contains(text(), 'Loading data')]")))

# wait for content to load
career_path_elements = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='abcd']/ul/li")))

# print out career paths
for element in career_path_elements:

    # get title attribute that usually contains career path text
    title = element.get_attribute("title")

    # sometimes career path is in span below this element
    if not title:

        # find the element and print its text
        span_element = element.find_element_by_xpath("span[not(contains(@class, 'currentJobHead'))]")
        print(span_element.text)

   # print title in other cases
    else:
        print(title)

Это напечатает следующее:

PHP Developer
Drupal Developer
Web Developer
Full Stack Developer
Back-End Developer
Full Stack PHP Developer
IT Director
Software Development Manager

Здесь есть несколько интересных объектов. Основной из них является загрузка Javascript на этой странице - при первом открытии страницы появляется индикатор «Загрузка данных ...». Мы должны подождать EC.invisibility_of_element для этого элемента, чтобы убедиться, что он исчез, прежде чем мы попытаемся найти какой-либо контент страницы.

После этого мы снова вызываем WebDriverWait, но на этот раз по «Карьерному пути» элементы на правой стороне страницы. Этот WebDriverWait вызов возвращает список элементов, хранящихся в career_path_elements. Мы можем oop просмотреть этот список элементов, чтобы напечатать путь карьеры каждого элемента.

Каждый элемент пути карьеры содержит текст пути карьеры в атрибуте title, поэтому мы вызываем element.get_attribute("title") для получения этот текст. Тем не менее, существует особый случай для элемента «Текущее место работы», где текст пути карьеры содержится на span на один уровень ниже. Мы обрабатываем случаи, когда title пусто, вызывая element.find_element_by_xpath(), чтобы найти span. Это гарантирует, что мы можем напечатать каждый элемент пути карьеры на странице.

...