Каковы эти разные ошибки, которые я получаю при очистке с помощью BeautifulSoup? - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь очистить этот сайт, который называется 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-разрядная.

1 Ответ

1 голос
/ 06 апреля 2019

В коде у вас есть 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)
...