Что это за разные ошибки, которые я получаю при очистке с помощью BeautifulSoup?

Я пытаюсь очистить этот сайт под названием whoscored.com, и вот простой код, который я использую для очистки определенной страницы.

import requests
import pandas as pd
from bs4 import BeautifulSoup

headers = {'User-Agent': 
           'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/47.0.2526.106 Safari/537.36'}
page = 
"https://www.whoscored.com/Teams/13/RefereeStatistics/England-Arsenal"

pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'lxml')
print(pageSoup)

Код работает нормально, но вот что он возвращает:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<meta content = "text/html; charset=utf-8" http-equiv = "Content-Type"/>
<title>404 - File or directory not found.</title>
<style type = "text/css">

<!--

body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans- 
serif;background:#EEEEEE;}

fieldset{padding:0 15px 10px 15px;} 

h1{font-size:2.4em;margin:0;color:#FFF;}

h2{font-size:1.7em;margin:0;color:#CC0000;} 

h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 

#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font- 
family:"trebuchet MS", Verdana, sans-serif;color:#FFF;

background-color:#555555;}

#content{margin:0 0 0 2%;position:relative;}

.content-container{background:#FFF;width:96%;margin- 
top:8px;padding:10px;position:relative;}

-->

</style>
</head>
<body>
<div id = "header"><h1>Server Error</h1></div>
<div id = "content">
<div class = "content-container"><fieldset>
<h2>404 - File or directory not found.</h2>
<h3>The resource you are looking for might have been removed, had its name 
changed, or is temporarily unavailable.</h3>
</fieldset></div>
</div>
<script type = "text/javascript">
//<![CDATA[
(function() {
var _analytics_scr = document.createElement('script');
_analytics_scr.type = 'text/javascript'; _analytics_scr.async = true; 
_analytics_scr.src = '/_Incapsula_Resource? 
SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&ns=1&cb=1578388490';
var _analytics_elem = document.getElementsByTagName('script')[0]; 
_analytics_elem.parentNode.insertBefore(_analytics_scr, _analytics_elem);
})();
// ]]>
</script></body>
</html>

Как видите, он возвращает 404 - file or directory not found или The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable. В конце есть еще одна куча ошибок, с которыми я не очень хорошо знаком.

У меня есть несколько идей, почему это может происходить. Может быть, есть JavaScript (я вижу это в конце) или это связано с какой-то контрмерой на веб-сайте. Тем не менее, я хотел бы точно знать, в чем проблема и что я могу сделать, чтобы решить эту проблему, и убедиться, что я получаю данные, которые я пытаюсь извлечь из страница, что, кстати, представляет собой всю таблицу. Немногое, что я получил от чтения подобных вопросов здесь, заключается в том, что мне нужно использовать Selenium, но я не уверен, как это сделать. Любая помощь будет оценена по достоинству.

Я на холостом ходу. Моя версия Python — 37 (64-разрядная), а мой компьютер — 64-разрядный.

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

furas 06.04.2019 17:27

фактический URL-адрес — whoscored.com/Teams/13/RefereeStatistics/Англия-Арсенал, но, похоже, меры по защите от ботов действуют, поэтому проверьте условия сайта в отношении парсинга.

QHarr 06.04.2019 17:29

Я отредактирую вопрос. Я, вероятно, сделал ошибку, копируя извинения URL. Тем не менее, это все еще создает ту же проблему

Abhishek 06.04.2019 17:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В коде у вас есть England/Arsenal в URL, но это должно быть England-Arsenal - см. / и -

Но страница использует JavaScript, поэтому с помощью BeautifulSoup вы не можете получить данные. Вам нужно будет использовать Selenium для управления веб-браузером, который будет загружать страницу и запускать JavaScript. После рендеринга страницы вы можете получить HTML из браузера (используя Selenium) и использовать BeautifulSoup для поиска ваших данных.


Получите таблицы с Selenium и BeautifulSoup

import selenium.webdriver
from bs4 import BeautifulSoup

url = "https://www.whoscored.com/Teams/13/RefereeStatistics/England-Arsenal"

driver = selenium.webdriver.Firefox()
#driver = selenium.webdriver.Chrome()
driver.get(url)

#print(driver.page_source) # HTML

soup = BeautifulSoup(driver.page_source, 'lxml')
all_tables = soup.find_all('table')
print('len(all_tables):', len(all_tables))

for table in all_tables:
    print(table)

Не могли бы вы предложить какой-нибудь материал/ресурс для чтения, чтобы начать с Selenium?

Abhishek 06.04.2019 17:51

Я всегда использую Google, чтобы найти решение какой-то проблемы. Вы можете начать с официальной документации для Селен с Питоном. Также есть Элементарный селен и один совет с этой страницы, остальные Советы в архиве

furas 06.04.2019 18:02

Я помещаю код, который использует Selenium + BeautifulSoup для получения таблиц на вашей странице.

furas 06.04.2019 18:12

Спасибо @furas. Я сам писал код, который мог бы помочь мне очищать другие таблицы. Я пройдусь по всем предложенным ссылкам.

Abhishek 07.04.2019 01:43

У меня есть несколько вопросов/проблем. Во-первых, почему я не могу найти все значения таблицы из HTML страницы - используя печать (driver.page_source)? Это из-за разницы между динамическим и статическим контентом? Во-вторых, как распечатать только одну таблицу из all_tables? Я использовал [:-2], но он печатает только имена столбцов. Кроме того, у меня возникли проблемы с сохранением полученного df в csv с помощью df.to_csv(). Код не показывает никаких ошибок, но я нигде не могу найти файл .csv на своем компьютере.

Abhishek 07.04.2019 19:25

там три <table>, поэтому у вас есть all_tables[0] , all_tables[1] и all_tables[2], но страница может использовать <table> для отображения разных элементов, т.е. он может использовать его для отображения меню. Используйте полный путь в df.to_csv('/full/path/to/file.csv'), и вы будете знать, где он должен быть.

furas 07.04.2019 19:39

используя print(driver.page_source), вы должны увидеть весь HTML - HTML, загруженный с сервера + HTML, созданный с помощью JavaScript. Но трудно найти что-то на экране, когда он отображает так много тегов HTML. driver.page_source - это строка, поэтому вы можете попытаться найти что-то, используя функцию строки, т.е. driver.page_source.find("<table") но с BeautifulSoup (или lxml, pyquery) проще что-то найти.

furas 07.04.2019 19:44

Другие вопросы по теме