Я пытаюсь почистить веб-сайт для некоторых пунктов списка, но красивый суп не находит ни одного на странице - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь составить таблицу, в которой я собираю все произведения каждого композитора из этой страницы и упорядочиваю их, добавляя "счет", например. 1 балл за 300-е место, 290 баллов за 10-е место и т. Д. С использованием скрипта Python.

Однако BeautifulSoup, похоже, не находит элементы li. Что я делаю неправильно? Скриншот страницы HTML: https://gyazo.com/73ff53fb332755300d9b7450011a7130

Я уже пытался использовать soup.li, soup.findAll("li") и soup.find_all("li"), но все возвращают "none" или подобное. Печать soup.body возвращает тело, поэтому я думаю, что у меня есть HTML-документ.

from bs4 import BeautifulSoup as bsoup
import requests

link = "https://halloffame.classicfm.com/2019/"
response = requests.get(link)
soup = bsoup(response.text, "html.parser")
print(soup.li)

Я надеялся, что это даст мне хотя бы один элемент li, но вместо этого он возвращает None.

1 Ответ

0 голосов
/ 21 апреля 2019

Я не вижу всех рейтингов от 300-1.Иногда страница показывает только 148, иногда 146, и самое низкое, что я видел, - 143. Не знаю, является ли это недостатком / ошибкой дизайна.Страница обновлена ​​на javascript, поэтому вы получаете пустой список.Этот контент не был обработан.

requests возвращает только контент, который не зависит от javascript для рендеринга, т.е. вы не получаете всего, что видите при использовании браузера, который, если javascript включен,позволит загружать дополнительный контент при запуске различных скриптов на странице.Это особенность современных адаптивных / динамических веб-страниц, где вам больше не нужно обновлять всю страницу, когда, например, выбор сделан на странице.

Часто вы можете использовать инструменты разработчика F12 для проверки веб-трафика, который страница использует для обновления контента через вкладку сети.Открыв вкладку «Сеть», обновите всю страницу, а затем выполните фильтрацию по XHR.

В этом случае информация фактически извлекается из тега скрипта, который уже содержит эту информацию.Вы можете открыть вкладку элементов (Chrome) и сделать Ctrl + F и найти имя композитора.Вы найдете одно совпадение в теге скрипта.Я использую регулярное выражение, чтобы найти тег сценария, в котором он находится, путем сопоставления по javascript var songs = [];, за которым следует объект, содержащий информацию о композиторе, в следующей группе регулярных выражений.

Пример из целевого тега сценария:

enter image description here

Вы можете получить их из тега скрипта

import requests
from bs4 import BeautifulSoup as bs
import re

soup = bs(requests.get('https://halloffame.classicfm.com/2019/', 'lxml').content, 'lxml')
r = re.compile(r'var songs = \[\];(.*)' , re.DOTALL)
data = soup.find('script', text=r).text
script = r.findall(data)[0].strip()
rp = re.compile(r'position:\s+(\d+)')
rankings = rp.findall(script)     
rt = re.compile(r'title:\s+"(.*)"')
titles = rt.findall(script) 

print(len(titles))
print(len(rankings)) 

Если вы можете найти остальные из этих рейтингов, вы можете затем сжать списки, покаизменение списка рейтинга

results = list(zip(titles, rankings[::-1]))

В любом случае, вы можете использовать лен заголовков, чтобы сгенерировать список номеров в обратном порядке, который даст рейтинг:

rankings = list(range(len(titles), 0, -1))
results = list(zip(titles, rankings[::-1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...