boxing / boxrec

Retrieve information from BoxRec and return it in JSON format
MIT License
109 stars 18 forks source link

BoxRec getEventById breaks when trying to parse table with extra header row #290

Closed mikedidomizio closed 2 years ago

mikedidomizio commented 2 years ago

Description

I think it's due to the extra table row when the event is pending approval

H:\projects\boxrec-testing\node_modules\boxrec\dist\helpers.js:1
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var BoxrecCommonTableHeader,cheerio=require("cheerio"),querystring=require("querystring"),boxrec_event_constants_1=require("./boxrec-pages/event/boxrec.event
.constants");function convertFractionsToNumber(e){switch(e){case"¼":case"¼":return.25;case"½":case"½":return.5;case"¾":case"¾":return.75;default:return 0}}function trimRemoveLineBreaks(e){return e.trim().replac
e(/(?:\r\n|\r|\n)/g,"").replace(/\s{2,}/g," ")}function changeToCamelCase(e){var r=e.replace(/\s(\w)/g,function(e){return e[1].toUpperCase()});return""+r.charAt(0).toLowerCase()+r.slice(1)}function getColumnDataByColumnHeader
(e,r,t,n){void 0===n&&(n=!0);var o=e(e("<div>").append(e("table").clone()).html()),a=r.findIndex(function(e){return e===t});if(-1<a){var i=o.find("tr:nth-child(1) td:nth-child("+(a+1)+")");if(n){var s=i.html();return s?trimRe
moveLineBreaks(s):""}return trimRemoveLineBreaks(i.text())}return""}function getValueForHeadersArr(e,r,t){return e.some(function(e){return e===r})?t:r}function getTableColumnData(e,o,a){void 0===o&&(o=1),void 0===a&&(a=!1);va
r i=[];return e.clone().find("> tbody tr").each(function(e,r){var t=cheerio.load(r)(this).find("td:nth-child("+o+")"),n=a?t.html():t.text();n&&i.push(trimRemoveLineBreaks(exports.stripArrows(n)))}),i}function getHeaderColumnT
ext(u,e){void 0===e&&(e=1);var l=[],d=u.clone().find("> thead:nth-child("+e+")");return d.find("th").each(function(e,r){var t=cheerio.load(r),n=trimRemoveLineBreaks(exports.stripArrows(t(this).text()));if(n.includes("lbs")||n
.includes("kilos"))l.push(getValueForHeadersArr(l,BoxrecCommonTableHeader.firstFighterWeight,BoxrecCommonTableHeader.secondFighterWeight));else if("w-l-d"!==n)if("last 6"!==n)if("rating"!==n){if(0===n.length){var o=d.siblings
("tbody").eq(0).find("tr:nth-child(1) td:nth-child("+(e+1)+")");if(!o.length)throw new Error("Could not get table body element");if(o.find(".star-icon").length||o.find(".fa-star").length)return void l.push(BoxrecCommonTableHe
ader.rating);if(o.find(".tick").length)return void l.push(BoxrecCommonTableHeader.tick);if(o.find("a[href*='/event/']").length)return void l.push(BoxrecCommonTableHeader.links);if(o.find(".boutResult").length)return void l.pu
sh(BoxrecCommonTableHeader.outcome);if(o.find(".flag").length)return void l.push(BoxrecCommonTableHeader.location);var a=trimRemoveLineBreaks(o.text());if(0<a.length&&!isNaN(a)||/[¼½¾]/.test(a))return void l.push(getValueForH
eadersArr(l,BoxrecCommonTableHeader.firstFighterWeight,BoxrecCommonTableHeader.secondFighterWeight));if(1===t("<div>"+o.html()+"</div>").find(".personLink").length)return void l.push(getValueForHeadersArr(l,BoxrecCommonTableH
eader.fighter,BoxrecCommonTableHeader.opponent));var i=getTableColumnData(u,e+1).filter(function(e,r,t){return t.indexOf(e)===r}),s=Object.keys(boxrec_event_constants_1.BoxingBoutOutcome),c=i.map(function(r){return s.findInde
x(function(e){return e===r})});if(c.length)if(0<c.reduce(function(e,r){return e+r}))return void l.push(BoxrecCommonTableHeader.outcomeByWayOf)}l.push(n)}else{l.some(function(e){return e===BoxrecCommonTableHeader.firstRating})
?l.push(BoxrecCommonTableHeader.secondRating):l.push(BoxrecCommonTableHeader.firstRating)}else l.some(function(e){return e===BoxrecCommonTableHeader.firstLast6})?l.push(BoxrecCommonTableHeader.secondLast6):l.push(BoxrecCommon
TableHeader.firstLast6);else l.push(getValueForHeadersArr(l,BoxrecCommonTableHeader.record,BoxrecCommonTableHeader.secondRecord))}),l}exports.convertFractionsToNumber=convertFractionsToNumber,exports.trimRemoveLineBreaks=trim
RemoveLineBreaks,exports.changeToCamelCase=changeToCamelCase,exports.getColumnDataByColumnHeader=getColumnDataByColumnHeader,function(e){e.age="age",e.career="career",e.date="date",e.day="day",e.debut="debut",e.division="divi
sion",e.fighter="fighter",e.firstLast6="firstLast6",e.firstFighterWeight="firstFighterWeight",e.firstRating="firstRating",e.links="links",e.location="location",e.miles="miles",e.name="name",e.outcome="outcome",e.opponent="opp
onent",e.outcomeByWayOf="outcomeByWayOf",e.points="points",e.rating="rating",e.residence="residence",e.result="result",e.rounds="rounds",e.secondLast6="secondLast6",e.secondFighterWeight="secondFighterWeight",e.secondRating="
secondRating",e.secondRecord="secondw-l-d",e.sport="sport",e.stance="stance",e.record="w-l-d",e.sex="sex",e.tick="tick",e.venue="venue"}(BoxrecCommonTableHeader=exports.BoxrecCommonTableHeader||(exports.BoxrecCommonTableHeade
r={})),exports.getValueForHeadersArr=getValueForHeadersArr,exports.getTableColumnData=getTableColumnData,exports.getHeaderColumnText=getHeaderColumnText,exports.townRegionCountryRegex=/\?country=([A-Za-z]+)(?:(?:&|&amp;)regio
n=([A-Za-z0-9]*))?(?:(?:&|&amp;)town=(\d+))?/,exports.stripCommas=function(e){return e.replace(/,/g,"")},exports.stripArrows=function(e){return e.replace(/[↕↓↑]/g,"")},exports.whatTypeOfLink=function(e){var r=e.match(/(\w+)\=
(\w+)/g),n={country:null,region:null,town:null};if(r)for(var t=function(e){var r=querystring.parse(e),t=Object.keys(r).map(function(e){return[e,r[e]]})[0];n[t[0]]=t[1]},o=0,a=r;o<a.length;o++){t(a[o])}return n.country&&n.regi
on&&n.town?"town":n.country&&n.region?"region":"country"},exports.getLocationValue=function(e,r){var t=e.match(/(\w+)=(\w+)/g);if(t)for(var n=0,o=t;n<o.length;n++){var a=o[n],i=querystring.parse(a),s=Object.keys(i);if(s[0]===
r)return i[s[0]]}return null},exports.replaceWithWeight=function(e){return trimRemoveLineBreaks(e).replace(/(\w+)\sTitle$/i,"$1weight Title")},exports.parseHeight=function(e){if(e){var r=/^(\d)\′\s(\d+)(½)?\″\s+\/\s+(\d{3})cm
$/;e.includes("#x2032")&&(r=/^(\d)\&\#x2032\;\s(\d{1,2})(\&\#xB[CDE]\;)?\&\#x2033\;\s\&\#xA0\;\s\/\s\&\#xA0\;\s(\d{3})cm$/);var t=e.match(r);if(t){var n=t[1],o=t[2],a=t[3],i=t[4],s=parseInt(o,10);return s+=convertFractionsToN
umber(a),[parseInt(n,10),s,parseInt(i,10)]}}return null};

Error: Could not get table body element
    at Element.<anonymous> (H:\projects\boxrec-testing\node_modules\boxrec\dist\helpers.js:1:1884)
    at LoadedCheerio.each (H:\projects\boxrec-testing\node_modules\cheerio\lib\api\traversing.js:519:26)
    at Object.getHeaderColumnText (H:\projects\boxrec-testing\node_modules\boxrec\dist\helpers.js:1:1452)
    at t.get (H:\projects\boxrec-testing\node_modules\boxrec\dist\decorators\bouts.decorator.js:1:265)
    at H:\projects\boxrec-testing\events.js:23:22
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

Example Event here (the status for this event will be changed)

https://boxrec.com/en/event/850422

Image of BoxRec

image

mikedidomizio commented 2 years ago

image

mikedidomizio commented 2 years ago

It does not crash until using bout getter. A simple workaround is to wrap the getter in a try/catch like so

        let response = await boxrec.getEventById(cookie, eventId);

        try {
            const {bouts} = response;
        .....