Данные отсутствуют при очистке с помощью Beautifulsoup4 - PullRequest
3 голосов
/ 25 марта 2019

На самом деле я новичок в разборе материала с Python Beautifulsoup4. Я соскребал этот сайт . Мне нужно Текущая цена за мил на первой странице.

Я уже провел 3 часа с этим. Пока ищу решение в интернете. Я узнал, что есть библиотека PyQT4, которая может имитировать, как веб-браузер, и загружать контент, а затем, когда загрузка будет завершена, вы сможете извлечь необходимые данные. Но я разбился.

Использовал этот подход для сбора данных в необработанном текстовом формате. Я пробовал и другие подходы.

def parseMe(url):
    soup = getContent(url)
    source_code = requests.get(url)
    plaint_text = source_code.text
    soup = BeautifulSoup(plaint_text, 'html.parser')
    osrs_text = soup.find('div', class_='col-md-12 text-center')
    print(osrs_text.encode('utf-8'))

Пожалуйста, посмотрите на это изображение . Я думаю, что проблема с тегами :: before и :: after. Они появляются после загрузки страницы.
Любая помощь будет высоко оценена.

Ответы [ 4 ]

1 голос
/ 25 марта 2019

Как уже упоминалось в других ответах, эта страница содержит только текст Current Price Per Mil: и 0USD.Значение в середине - 0.8 - динамически получается с помощью JS из URL-адреса, описанного ниже (который можно получить с помощью описанного здесь (например) процесса и во многих других местах . Этот сайт проверяет ботовпоэтому у вас есть , чтобы использовать метод, описанный (например) здесь .

Итак, все вместе:

url = 'https://api.boglagold.com/api/product/?id=osrs-gold&couponCode=null'
import requests
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'})

response.json()['sellPrice']

Вывод:

0.8
1 голос
/ 25 марта 2019

Веб-страница создает XHR для извлечения файла JSON с ценой в нем

import requests

r = requests.get('https://api.boglagold.com/api/product/?id=osrs-gold&couponCode=null')
j = r.json()
# print(j)
print('sellPrice', j['sellPrice'])
print('buyPrice', j['buyPrice'])

Выходы:

sellPrice 0.8
buyPrice 0.62
1 голос
/ 25 марта 2019

Вы должны использовать selenium вместо `запросов:

from selenium import webdriver
from bs4 import BeautifulSoup

def parse(url):
    driver = webdriver.Chrome('D:\Programming\utilities\chromedriver.exe')
    driver.get('https://boglagold.com/buy-runescape-gold/')
    soup = BeautifulSoup(driver.page_source)
    return soup.find('h4', {'id': 'curr-price-per-mil-text'}).text

parse()

Выход:

'Current Price Per Mil: 0.80USD'

Причина в том, что значение этого элемента получается через JavaScript, который requests не может обработать. Этот конкретный фрагмент кода использует драйвер Chrome; при желании вы можете использовать Firefox / другой аналог браузера (вам нужно будет установить библиотеку selenium и самостоятельно найти драйвер Chrome).

0 голосов
/ 25 марта 2019

Проблема в том, что javascript динамически добавляет данные, которые вы хотите удалить на этом сайте.Вы можете попробовать запустить JS на стороне клиента, подождать получения данных, которые вы хотите удалить, и затем получить содержимое DOM - если вы хотите сделать это таким образом, посмотрите на @ gmds answer вопрос.Другой метод - проверить, какие запросы выполняет код javascript, а какой содержит необходимую вам информацию.Затем вы можете сделать этот запрос (ы) с помощью Python и получить необходимые данные без необходимости использования PyQT4 или даже BS4.

...