Определенный контент не загружается при очистке сайта с Beautiful Soup - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь вычистить оценки из рецептов на NYT Cooking, но у меня проблемы с получением нужного мне контента.Когда я смотрю на источник на странице NYT, я вижу следующее:

<div class="ratings-rating">
    <span class="ratings-header ratings-content">194 ratings</span>

    <div class="ratings-stars-wrap">
      <div class="ratings-stars ratings-content four-star-rating avg-rating">

Содержимое, которое я пытаюсь извлечь, - 194 ratings и four-star-rating.Однако, когда я получаю исходный код страницы через Beautiful Soup, я вижу только следующее:

 <div class="ratings-rating">
    <span class="ratings-header ratings-content"><%= header %></span>

    <div class="ratings-stars-wrap">
      <div class="ratings-stars ratings-content <%= ratingClass %> <%= state %>">

Используемый код:

url = 'https://cooking.nytimes.com/recipes/1020049-lemony-chicken-soup-with-fennel-and-dill'

r = get(url, headers = headers, timeout=15)
page_soup = soup(r.text,'html.parser')

Любые мысли, почему эта информация не 'тянет?

Ответы [ 2 ]

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

гораздо проще использовать атрибут = селекторы значений для захвата из диапазона с классом ratings-metadata

import requests
from bs4 import BeautifulSoup

data = requests.get('https://cooking.nytimes.com/recipes/1020049-lemony-chicken-soup-with-fennel-and-dill')
soup = BeautifulSoup(data.content, 'lxml')
rating = soup.select_one('[itemprop=ratingValue]').text
ratingCount = soup.select_one('[itemprop=ratingCount]').text
print(rating, ratingCount)
0 голосов
/ 05 марта 2019

Попробуйте использовать приведенный ниже код

import requests
import lxml
from lxml import html
import re

url = "https://cooking.nytimes.com/recipes/1019706-spiced-roasted-cauliflower-with-feta-and-garlic?action=click&module=Recirculation%20Band%20Recipe%20Card&region=More%20recipes%20from%20Alison%20Roman&pgType=recipedetails&rank=1"

r = requests.get(url)
tree = html.fromstring(r.content)

t = tree.xpath('/html/body/script[14]')[0]

# look for value for bootstrap.recipe.avg_rating
m = re.search("bootstrap.recipe.avg_rating = ", t.text)
colon = re.search(";", t.text[m.end()::])
rating = t.text[m.end():m.end()+colon.start()]
print(rating)

# look for value for bootstrap.recipe.num_ratings = 
n = re.search("bootstrap.recipe.num_ratings = ", t.text)
colon2 = re.search(";", t.text[n.end()::])
star = t.text[n.end():n.end()+colon2.start()]
print(star)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...