выскабливание h3 из div с использованием python - PullRequest
1 голос
/ 11 мая 2019

Я бы хотел очистить, используя Python 3.6, заголовки H3 из DIV - со страницы:

https://player.bfi.org.uk/search/rentals?q=&sort=title&page=1

Обратите внимание, что номер страницы изменяется с шагом 1.

Я изо всех сил пытаюсь вернуть или идентифицировать название.

from requests import get
url = 'https://player.bfi.org.uk/search/rentals?q=&sort=title&page=1'
response = get(url)
from bs4 import BeautifulSoup
html_soup = BeautifulSoup(response.text, 'lxml')
type(html_soup)
movie_containers = html_soup.find_all('div', class_ = 'card card--rentals')
print(type(movie_containers))
print(len(movie_containers))

Я также пытался их циклически просматривать:

for dd in page("div.card__content"):
    print(div.select_one("h3.card__title").text.strip())

Любая помощь была бы полезной.

Спасибо,

Я ожидаю результатов Названия каждого фильма на каждой странице, включая ссылку на фильм.Например.https://player.bfi.org.uk/rentals/film/watch-akenfield-1975-online

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Страница загружает контент через xhr на другой URL, поэтому вы пропустили это.Вы можете имитировать запрос xhr POST, который использует страница, и изменять сообщение, отправленное json.Если вы измените size, вы получите больше результатов.

import requests

data = {"size":1480,"from":0,"sort":"sort_title","aggregations":{"genre":{"terms":{"field":"genre.raw","size":10}},"captions":{"terms":{"field":"captions"}},"decade":{"terms":{"field":"decade.raw","order":{"_term":"asc"},"size":20}},"bbfc":{"terms":{"field":"bbfc_rating","size":10}},"english":{"terms":{"field":"english"}},"audio_desc":{"terms":{"field":"audio_desc"}},"colour":{"terms":{"field":"colour"}},"mono":{"terms":{"field":"mono"}},"fiction":{"terms":{"field":"fiction"}}},"min_score":0.5,"query":{"bool":{"must":{"match_all":{}},"must_not":[],"should":[],"filter":{"term":{"pillar.raw":"rentals"}}}}}
r = requests.post('https://search-es.player.bfi.org.uk/prod-films/_search', json = data).json()
for film in r['hits']['hits']:
    print(film['_source']['title'], 'https://player.bfi.org.uk' + film['_source']['url'])

Фактический счетчик результатов для rentals указан в json, r['hits']['total'], поэтому вы можете выполнить первоначальный запрос, начиная с большого числа.выше, чем вы ожидаете, проверьте, нужен ли еще один запрос, а затем соберите все дополнительные, изменив значения from и size, чтобы убрать все невыполненные.

import requests
import pandas as pd

initial_count = 10000
results = []

def add_results(r):
    for film in r['hits']['hits']:
        results.append([film['_source']['title'], 'https://player.bfi.org.uk' + film['_source']['url']])

with requests.Session() as s:
    data = {"size": initial_count,"from":0,"sort":"sort_title","aggregations":{"genre":{"terms":{"field":"genre.raw","size":10}},"captions":{"terms":{"field":"captions"}},"decade":{"terms":{"field":"decade.raw","order":{"_term":"asc"},"size":20}},"bbfc":{"terms":{"field":"bbfc_rating","size":10}},"english":{"terms":{"field":"english"}},"audio_desc":{"terms":{"field":"audio_desc"}},"colour":{"terms":{"field":"colour"}},"mono":{"terms":{"field":"mono"}},"fiction":{"terms":{"field":"fiction"}}},"min_score":0.5,"query":{"bool":{"must":{"match_all":{}},"must_not":[],"should":[],"filter":{"term":{"pillar.raw":"rentals"}}}}}
    r = s.post('https://search-es.player.bfi.org.uk/prod-films/_search', json = data).json()
    total_results = int(r['hits']['total'])
    add_results(r)

    if total_results > initial_count :
        data['size'] = total_results - initial_count
        data['from'] = initial_count
        r = s.post('https://search-es.player.bfi.org.uk/prod-films/_search', json = data).json()
        add_results(r)

df = pd.DataFrame(results, columns = ['Title', 'Link'])
print(df.head())
0 голосов
/ 11 мая 2019

проблема, с которой вы столкнулись, не в том, чтобы найти div - я думаю, вы делаете это правильно.Однако, когда вы пытаетесь получить доступ к веб-сайту с помощью

from requests import get
url = 'https://player.bfi.org.uk/search/rentals?q=&sort=title&page=1'
response = get(url)

, ответ фактически не включает весь контент, который вы видите в браузере.Вы можете проверить, что это так с 'card' in response == False.Скорее всего, это связано с тем, что после загрузки веб-сайта все карты загружаются с помощью javascript, поэтому просто загрузить базовый контент с помощью библиотеки requests недостаточно для получения всей информации, которую вы хотите очистить.

Я предлагаю вам, возможно, попробовать посмотреть, как веб-сайт загружает все карты - вкладка Сеть в инструментах разработчика браузера может помочь.

...