2016-10-20 6 views
2

Я прошел через большинство решений для подобных проблем, но не нашел того, что работает и, что еще важнее, не нашел объяснения, почему это происходит за пределами того, когда Javascript или что-то еще вызывается на сайте, который очищается.BeautifulSoup возвращает None, хотя элемент существует

Я пытаюсь очистить стол для игры «должностных лиц» с сайта: http://www.pro-football-reference.com/boxscores/201309050den.htm

мой код:

url = "http://www.pro-football-reference.com/boxscores/201309050den.htm" 
html = urlopen(url)  
bsObj = BeautifulSoup(html, "lxml") 
officials = bsObj.findAll("table",{"id":"officials"}) 

for entry in officials: 
    print(str(entry)) 

Я просто печать на консоль на данный момент, но я получаю пустой список с findAll или None с поиском. Я также пробовал это с базовым html.parser без везения.

Может ли кто-нибудь с лучшим пониманием html рассказать мне о том, что отличается от этой веб-страницы? Заранее спасибо!

+1

Этот элемент не существует. Посетите URL-адрес браузера и выберите «источник просмотра» или аналогичный. Найдите «официальный». Обратите внимание, что единственное, что выглядит как таблица с этим идентификатором, находится внутри комментария (т. Е. Внутри ''). –

+0

то, что говорит сайту, чтобы показать таблицу официальных лиц? Я вижу элемент на сайте, когда я вхожу в Dev Tools, поэтому может ли он существовать для сайта, чтобы вытащить форму, но не в пределах сайтов html, которые видит BeautifulSoup? Кошка Шрёдингера? – scotche

+0

Помимо этого, обязательно прочтите раздел 2 своих [условий использования] (http://www.sports-reference.com/termsofuse.html), относящихся к автоматическому извлечению данных. –

ответ

0

Вы не видите его, потому что его нет. Попробуйте turn JS и откройте его с помощью браузера, вы увидите, что его нет - на веб-сайте есть некоторые манипуляции с JS DOM.

Вы можете выбрать:

  1. HTML, вы хотите там, только в комментариях, извлечь его из комментария и инициализации нового супа с ним.
  2. Используйте Selenium или эквивалентный инструмент для визуализации JS (что, как именно ваш браузер делает)
0

попробовать этот код:

from selenium import webdriver 
import time 
from bs4 import BeautifulSoup 


driver = webdriver.Chrome() 
url= "http://www.pro-football-reference.com/boxscores/201309050den.htm" 
driver.maximize_window() 
driver.get(url) 

time.sleep(5) 
content = driver.page_source.encode('utf-8').strip() 
soup = BeautifulSoup(content,"html.parser") 
officials = soup.findAll("table",{"id":"officials"}) 

for entry in officials: 
    print(str(entry)) 


driver.quit() 

Это будет печатать:

<table class="suppress_all sortable stats_table now_sortable" data-cols-to-freeze="0" id="officials"><thead><tr class="thead onecell"><td class=" center" colspan="2" data-stat="onecell">Officials</td></tr></thead><caption>Officials Table</caption><tbody> 
<tr data-row="0"><th class=" " data-stat="ref_pos" scope="row">Referee</th><td class=" " data-stat="name"><a href="/officials/ColeWa0r.htm">Walt Coleman</a></td></tr> 
<tr data-row="1"><th class=" " data-stat="ref_pos" scope="row">Umpire</th><td class=" " data-stat="name"><a href="/officials/ElliRo0r.htm">Roy Ellison</a></td></tr> 
<tr data-row="2"><th class=" " data-stat="ref_pos" scope="row">Head Linesman</th><td class=" " data-stat="name"><a href="/officials/BergJe1r.htm">Jerry Bergman</a></td></tr> 
<tr data-row="3"><th class=" " data-stat="ref_pos" scope="row">Field Judge</th><td class=" " data-stat="name"><a href="/officials/GautGr0r.htm">Greg Gautreaux</a></td></tr> 
<tr data-row="4"><th class=" " data-stat="ref_pos" scope="row">Back Judge</th><td class=" " data-stat="name"><a href="/officials/YettGr0r.htm">Greg Yette</a></td></tr> 
<tr data-row="5"><th class=" " data-stat="ref_pos" scope="row">Side Judge</th><td class=" " data-stat="name"><a href="/officials/PattRi0r.htm">Rick Patterson</a></td></tr> 
<tr data-row="6"><th class=" " data-stat="ref_pos" scope="row">Line Judge</th><td class=" " data-stat="name"><a href="/officials/BaynRu0r.htm">Rusty Baynes</a></td></tr> 
</tbody></table> 
+0

Большое спасибо за помощь !! – scotche

0

Это находится в источнике, он просто прокомментирован, тривиально удалять комментарии с помощью regex:

from bs4 import BeautifulSoup 
import requests 
import re 

url = "http://www.pro-football-reference.com/boxscores/201309050den.htm" 
html = requests.get(url).content 
bsObj = BeautifulSoup(re.sub("<!--|-->","", html), "lxml") 
officials = bsObj.find_all("table",{"id":"officials"}) 

for entry in officials: 
    print(entry) 

Существует только одна таблица, поэтому вам не нужно find_all и ваш цикл немного бессмысленно, просто использовать найти:

In [1]: from bs4 import BeautifulSoup 
    ...: import requests 
    ...: import re 
    ...: url = "http://www.pro-football-reference.com/boxscores/201309050den.htm" 
    ...: 
    ...: html = requests.get(url).content 
    ...: bsObj = BeautifulSoup(re.sub("<!--|-->","", html), "lxml") 
    ...: officials = bsObj.find(id="officials") 
    ...: print(officials) 
    ...: 

<table class="suppress_all sortable stats_table" data-cols-to-freeze="0" id="officials"><caption>Officials Table</caption><tr class="thead onecell"><td class=" center" colspan="2" data-stat="onecell">Officials</td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Referee</th><td class=" " data-stat="name"><a href="/officials/ColeWa0r.htm">Walt Coleman</a></td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Umpire</th><td class=" " data-stat="name"><a href="/officials/ElliRo0r.htm">Roy Ellison</a></td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Head Linesman</th><td class=" " data-stat="name"><a href="/officials/BergJe1r.htm">Jerry Bergman</a></td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Field Judge</th><td class=" " data-stat="name"><a href="/officials/GautGr0r.htm">Greg Gautreaux</a></td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Back Judge</th><td class=" " data-stat="name"><a href="/officials/YettGr0r.htm">Greg Yette</a></td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Side Judge</th><td class=" " data-stat="name"><a href="/officials/PattRi0r.htm">Rick Patterson</a></td></tr> 
<tr><th class=" " data-stat="ref_pos" scope="row">Line Judge</th><td class=" " data-stat="name"><a href="/officials/BaynRu0r.htm">Rusty Baynes</a></td></tr> 
</table> 

In [2]: