如何使用Python获取手风琴块内隐藏div的内容?

时间:2015-01-18 19:06:55

标签: python web-scraping accordion screen-scraping hidden

我正试图从"棒球场目录"中删除设施信息。在本页右侧http://seattle.mariners.mlb.com/ballparks/stadium_maps.jsp?c_id=sea

我一直在寻找几个小时试图弄清楚如何访问隐藏在"手风琴"内的div。 div,包含该Directory下拉列表中的所有信息。我在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'))

我真的很感激这方面的任何帮助,因为我似乎无法访问手风琴div中的html。谢谢!

1 个答案:

答案 0 :(得分:0)

此部分是通过单独的XHR调用形成的,该调用返回JSON响应。

开始新的session,访问主网址,然后单独向“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()

仅供参考,这是用于形成该部分的源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