2015-01-18 5 views
3

Я пытаюсь скрести удобства информации от «Ballpark каталога» на правой стороне этой страницы http://seattle.mariners.mlb.com/ballparks/stadium_maps.jsp?c_id=seaКак получить содержимое скрытых divs внутри блока гармоник с Python?

Я искал вокруг в течение нескольких часов, пытаясь выяснить, как получить доступ к дивам, которые скрыты внутри «гармошки «div», который содержит всю информацию в раскрывающемся списке «Каталог». Я написал следующий код в Python, но когда я пытаюсь получить доступ к div внутри аккордеона, там ничего нет (что можно увидеть, когда я попытался распечатать свой переменный аккордеон, а выход был div без содержимого).

html = requests.get('http://seattle.mariners.mlb.com/ballparks/stadium_maps.jsp?c_id=sea').text 

# Convert HTML to BeautifulSoup object 
soup = BeautifulSoup(html) 
accordion = soup.find(id = 'accordion') 
#print accordion 
divs = accordion.find_all('div') 
#print divs 
for div in divs: 
    item = div.find('ul') 
    for venue in item.find_all('li'): 
     for i in venue.find_all('p'): 
      clas = i.get('class') 
      if clas == 'section': 
       venuetype.append(i.get('data-type')) 
       venuesubtype.append(i.get('data-subtype')) 
       venuename.append(i.get('data-name')) 
       section.append(i.get('data-section')) 

Я был бы очень признателен за любую помощь по этому вопросу, так как я не могу показаться, чтобы получить доступ к HTML в аккордеона дел. Благодаря!

+0

Я думаю, что JavaScript заполняет

и поэтому вы не получите никакого контента с вашего запроса GET. – jonnybazookatone

+0

@jonnybazookatone это правильная догадка, посмотрите ответ ниже. Благодарю. – alecxe

ответ

0

Этот раздел сформирован с помощью отдельного вызова XHR, который возвращает ответ JSON.

Начать новую session, посетите основной URL, затем сделать отдельный запрос на «sea_map.json» и получить ответ через .json():

import requests 

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36'} 

with requests.Session() as session: 
    session.headers = headers 

    session.get('http://seattle.mariners.mlb.com/ballparks/stadium_maps.jsp?c_id=sea') 
    response = session.get('http://seattle.mariners.mlb.com/gdcross/components/game/mlb/mobile/ballpark/iphone/config/sea_map.json') 

    print response.json() 

FYI, это источник JSON, который используется для сформируйте раздел. Вам нужно выяснить, как они анализируют JSON и формируют список, который вы хотите очистить. Логика находится внутри файла stadiumMaps.js.


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

>>> from selenium import webdriver 
>>> 
>>> driver = webdriver.PhantomJS() 
>>> driver.get('http://seattle.mariners.mlb.com/ballparks/stadium_maps.jsp?c_id=sea') 
>>> 
>>> for link in driver.find_elements_by_css_selector('div#accordion h5 a'): 
...  print link.text 
... 
ATM 
Food 
Info 
Merchandise 
Restroom 
Specialty 
Tickets 
Смежные вопросы