【问题标题】:How to get contents of hidden divs within an accordion block with Python?如何使用 Python 在手风琴块中获取隐藏 div 的内容?
【发布时间】:2015-03-16 19:24:50
【问题描述】:

我正在尝试从本页右侧的“棒球场目录”中抓取设施信息http://seattle.mariners.mlb.com/ballparks/stadium_maps.jsp?c_id=sea

我已经搜索了好几个小时,试图弄清楚如何访问隐藏在“accordion”div 中的 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'))

我非常感谢您对此事的任何帮助,因为我似乎无法访问手风琴 div 中的 html。谢谢!

【问题讨论】:

  • 我的猜测是 JavaScript 正在填充
    ,因此您的 GET 请求不会获得任何内容。
  • @jonnybazookatone 这是一个正确的猜测,请查看下面的答案。谢谢。

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


【解决方案1】:

此部分是通过一个单独的 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()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多