我正试图从"棒球场目录"中删除设施信息。在本页右侧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。谢谢!
答案 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