Не могу найти конкретный компонент класса, используя BeautifulSoup - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь сделать скребок для сайта кино, чтобы собрать список названий фильмов. Я попытался использовать BeautifulSoup для разбора HTML-файла, я увидел, что каждый фильм находится внутри класса с именем "movie-row". Но использование метода select для этого класса не позволило получить соответствующие данные сайта. Ближайшим компонентом HTML, который мне удалось получить, был родительский класс .quickbook-section.

Почему некоторые теги HTML доступны с помощью BS, а другие нет?

Это код, который я написал для этого.

def get_movies_names():
    url = "https://www.yesplanet.co.il/#/buy-tickets-by-cinema?in-cinema=1025&at=2018-11-09&view-mode=list"
    raw_html = util.simple_get(url)
    bs = BeautifulSoup(raw_html, 'html.parser')
    bs.select(".movie-row")

(simple_get - это просто функция, возвращающая содержимое ответа HTML)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Как указали некоторые люди, он загружается через javascript, и BS4 на самом деле не работает с этим. Когда вы видите данные, которые загружаются через JavaScript, вы можете поспорить, что где-то есть вызов API. Вместо того, чтобы пытаться очистить данные, вы можете посмотреть, вызывает ли он объект JSON, и можете ли вы получить доступ к объекту JSON без какого-либо apikey.

Вам может понадобиться настроить некоторые шаблоны URL, если вам нужно что-то другое.

import requests, json
# Ignore the insecure warning
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

url = "https://www.yesplanet.co.il/il/data-api-service/v1/poster/10100/by-showing-type/SHOWING?lang=he_IL&ordering=desc"

# Get the page
response = requests.get(url, verify=False)

# Load into json
j = json.loads(response.text)

# process what you want
for poster in j['body']['posters']:
    print(poster['url'], poster['featureTitle'])

Вывод из сценария выглядит следующим образом:

/films/bohemian-rhapsody רפסודיה בוהמית
/films/the-other-story סיפור אחר
/films/the-girl-in-the-spiders-web הנערה ברשת העכביש
/films/the-nutcracker-and-the-four-realms מפצח האגוזים  וארבע הממלכות
/films/911 11 בספטמבר
/films/virgins אין בתולות בקריות

Доступны следующие атрибуты для каждого плаката: attributes, code, dateStarted, featureTitle, mediaList, posterSrc, url и weight.

Если вам интересно, как я обнаружил URL, я использовал консоль разработчика Chrome и перезагрузил страницу. Отфильтруйте по XHR (XMLHttpRequest), и вы увидите URL-адреса, содержащие данные.

0 голосов
/ 09 ноября 2018

Похоже, что конкретный веб-сайт отображает данные фильма с помощью JavaScript.

Красивый суп не является браузером, поэтому у него нет DOM, поэтому он не может запускать код JavaScript. Все, что он делает, это получает содержимое страницы и анализирует его. Если вы просматриваете источник страницы, о которой идет речь, и просматриваете источник (щелкните правой кнопкой мыши «View Source» в большинстве браузеров) и выполните поиск по запросу .movie-row, вы обнаружите, что совпадений нет.

В этом случае вам придется найти альтернативу очистке данных, попытаться выяснить, что делает код JavaScript и использовать его. В качестве альтернативы вы можете посмотреть на использование Selenium и PhantomJS.

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