2016-06-16 3 views
0

Я научился царапать сайты с помощью BeautifulSoup, и все идет хорошо. Заимствуя код, мне удалось очистить некоторые веб-сайты. Однако, когда я пришел на сайт ниже, я возвращаю только верхний ряд таблицы. Я заметил в html, что кодер сайта сделал строку заголовка тегом td вместо th тега, и мне было интересно, может ли это вызвать мою проблему. Если да, есть ли работа? Мне что-то не хватает? Я пробовал использовать разные парсеры.Python BeautifulSoup Returning Top Row Only

url = 'https://www.twinspires.com/php/brisstats/report.php?bris_id=4061015&report=activity' 
    soup = BeautifulSoup(urllib2.urlopen(url).read(), 'html5lib') 

    data = [] 
    table = soup.find('table', attrs={'id':'reporttable'}) 
    rows = table.findAll('tr') 

    for row in rows: 
     print row 
     cols = table.find_all('td') 
     cols = [ele.text.strip() for ele in cols] 
     data.append([ele for ele in cols if ele]) # Get rid of empty values 
    print data 

простаивает выход для печати строк и данных отчетности

<tr> 
<td class="field-title" width="15%">Activity</td> 
<td class="field-title" width="10%">Date</td> 
<td class="field-title" width="10%">Track</td> 
<td class="field-title" width="9%">Distance</td> 
<td class="field-title" width="5%">Surf</td> 
<td class="field-title" width="5%">Cond</td> 
<td class="field-title" width="9%">Time</td> 
<td class="field-title" width="10%">Class</td> 
<td class="field-title" width="5%">Fin</td> 
<td class="field-title">Comment</td> 
</tr> 
[[u'Activity', u'Date', u'Track', u'Distance', u'Surf', u'Cond', u'Time', u'Class', u'Fin', u'Comment']] 
+0

Я предполагаю, что вы пытаетесь очистить * содержимое * таблицы? К сожалению, сама таблица, помимо строки заголовка (неправильно отмеченной), генерируется JavaScript, поэтому вам нужно будет использовать что-то вроде 'selenium' или' phantomjs' для визуализации * окончательного * HTML, прежде чем вы сможете его очистить , Вы можете просмотреть отображаемый HTML, используя инструменты разработчика вашего браузера. – MattDMo

ответ

-1

Фактические данные в таблице заселяется с помощью JavaScript, поэтому она не видна BeautifulSoup.

К счастью для вас, это кодер имеет жестко закодированы имя пользователя и пароль для удаленного сервиса, который возвращает данные используются для заполнения таблицы:

<script> 
    var brisid ='4061015'; 
    $(document).ready(function(){ 
     var crossDomainUrl = 'https://www.twinspires.com/php/fw/php_BRIS_BatchAPI/2.3/Brisstats/activity?bris_id=4061015&username=username&password=password&output=json'; 
     $.ajax({ url: crossDomainUrl, 
      dataType: 'jsonp', 
      jsonp: 'jsonpcallback', 
      jsonpCallback: 'dispdata' 
     }); 
    }); 
</script> 

Используя отличную requests библиотеку, это так просто как:

>>> import requests 
>>> url = `https://www.twinspires.com/php/fw/php_BRIS_BatchAPI/2.3/Brisstats/activity?bris_id=4061015&username=username&password=password&output=json` 
>>> r = requests.get(url) 
>>> data = r.json() 
>>> data['activity']['activity-log-proc']['activity-logs']['activity-log'][0] 
{u'comment': u'bmp brk,ins to 5/16pl', u'Distance': u'1m', u'Finish': u'4', u'laid_off': [], u'country': u'USA', u'time': [], u'surface': u'T', u'track_id': u'BEL - 09', u'track_condition': u'FM', u'race_number': u'9', u'race_type': u'Race-green', u'day_evening': u'D', u'horse_name': u'Antebellum', u'race_date': u'15Jun16', u'date': u'2016-06-15 00:00:00.0', u'class': u'MCL40000'} 

Вы можете перебрать data['activity']['activity-log-proc']['activity-logs']['activity-log'], чтобы получить все результаты:

for i in data['activity']['activity-log-proc']['activity-logs']['activity-log']: 
    print(i['track_condition']) # etc.