Bri*_*ght 3 python beautifulsoup html-parsing web-scraping drop-down-menu
这是一个列出所选球员棒球统计数据的页面示例,默认为最近一年(2014 年,即将是 2015 年) http://www.koreabaseball.com/Record/Player/HitterDetail/Game.aspx?玩家 ID=76325
下拉列表允许用户选择回溯到 2010 年的年份,但不会更改显示的 url。如何从下拉列表中的每个值中抓取所有可用年份?
我目前正在使用 Python 和 BeautifulSoup,但我愿意使用任何可以完成工作的东西。
<select name="ctl00$ctl00$cphContainer$cphContents$ddlYear"
onchange="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$cphContainer$cphContents$ddlYear\',\'\')', 0)"
id="cphContainer_cphContents_ddlYear"
class="select02 mgt30">
<option value="2014">2014</option>
<option value="2013">2013</option>
<option selected="selected" value="2012">2012</option>
<option value="2011">2011</option>
<option value="2010">2010</option>
Run Code Online (Sandbox Code Playgroud)
分两步做:
ctl00$ctl00$cphContainer$cphContents$ddlYear负责年份的参数一起解析2013 年的实现示例(使用requests和BeautifulSoup):
from bs4 import BeautifulSoup
import requests
url = 'http://www.koreabaseball.com/Record/Player/HitterDetail/Game.aspx?playerId=76325'
with requests.Session() as session:
session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'}
# parsing parameters
response = session.get(url)
soup = BeautifulSoup(response.content)
data = {
'ctl00$ctl00$cphContainer$cphContents$ddlYear': '2013',
'ctl00$ctl00$txtSearchWord': '',
'__EVENTTARGET': soup.find('input', {'name': '__EVENTTARGET'}).get('value', ''),
'__EVENTARGUMENT': soup.find('input', {'name': '__EVENTARGUMENT'}).get('value', ''),
'__LASTFOCUS': soup.find('input', {'name': '__LASTFOCUS'}).get('value', ''),
'__VIEWSTATE': soup.find('input', {'name': '__VIEWSTATE'}).get('value', ''),
'__VIEWSTATEGENERATOR': soup.find('input', {'name': '__VIEWSTATEGENERATOR'}).get('value', ''),
'__EVENTVALIDATION': soup.find('input', {'name': '__EVENTVALIDATION'}).get('value', ''),
}
# parsing data
response = session.post(url, data=data)
soup = BeautifulSoup(response.content)
for row in soup.select('table.tData01 tr'):
print [td.text for td in row.find_all('td')]
Run Code Online (Sandbox Code Playgroud)
这将打印 2013 年所有统计表的内容:
[u'KIA', u'16', u'0.364', u'55', u'8', u'20', u'3', u'0', u'3', u'11', u'5', u'0', u'14', u'0', u'14', u'1']
[u'LG', u'15', u'0.321', u'53', u'7', u'17', u'1', u'0', u'2', u'9', u'1', u'1', u'6', u'3', u'10', u'2']
[u'NC', u'16', u'0.237', u'59', u'5', u'14', u'2', u'0', u'2', u'10', u'2', u'0', u'3', u'0', u'17', u'2']
[u'SK', u'16', u'0.235', u'51', u'7', u'12', u'1', u'0', u'3', u'13', u'1', u'3', u'13', u'1', u'12', u'4']
[u'\ub450\uc0b0', u'16', u'0.368', u'57', u'16', u'21', u'2', u'1', u'4', u'21', u'2', u'1', u'12', u'0', u'13', u'2']
[u'\ub86f\ub370', u'16', u'0.375', u'56', u'9', u'21', u'4', u'0', u'3', u'13', u'4', u'3', u'11', u'0', u'9', u'3']
[u'\uc0bc\uc131', u'16', u'0.226', u'62', u'8', u'14', u'5', u'0', u'3', u'10', u'0', u'0', u'8', u'1', u'15', u'1']
[u'\ud55c\ud654', u'15', u'0.211', u'57', u'7', u'12', u'3', u'0', u'2', u'9', u'0', u'0', u'1', u'1', u'19', u'3']
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8147 次 |
| 最近记录: |