Xpath для определенных элементов - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблема с очисткой текста определенного элемента с этой веб-страницы:

https://www.oddsportal.com/soccer/africa/africa-cup-of-nations/benin-togo-IsfnZDFd/

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

Это то, что я пытался найти коэффициенты букмекерской конторы, но это не работает:

pjs <- wdman::phantomjs()

eCap <- list(phantomjs.page.settings.userAgent 
             = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 
  Firefox/29.0", phantomjs.page.settings.loadImages = FALSE, phantomjs.phantom.cookiesEnabled = TRUE, phantomjs.phantom.javascriptEnabled = TRUE)


remDr <- remoteDriver(browserName = "phantomjs", port = 4567L, extraCapabilities = eCap)

remDr$open()



remDr$navigate("https://www.oddsportal.com/soccer/africa/africa-cup-of-nations/benin-togo-IsfnZDFd/")
match<-remDr$findElement('xpath','//*[@id="col-content"]/h1')
result<-remDr$findElement('xpath', '//*[@id="event-status"]/p/strong')
odds<-remDr$findElements('xpath', '//*[@class="name" and contains(text(), "18Bet")]')

odds1 <- data.frame(odds = unlist(sapply(odds, function(x){x$getElementText()})))

pjs$stop()

То, что я хочу, это 3 коэффициента в последнем div, но естьна странице много разных букмекеров, и я могу выбрать только все коэффициенты букмекера, моя цель - выбрать точные коэффициенты букмекера, но я не уверен, как этого добиться, так как нет никакой информации о букмекере в div с коэффициентами.

<tr class="lo odd">
    <td>
        <div class="l">
            <a class="name2" title="Go to 18bet website!" onclick="return !window.open(this.href)" href="/bookmaker/18bet/link/"><span class="blogos l416"></span></a>&nbsp;
            <a class="name" title="Go to 18bet website!" onclick="return !window.open(this.href)" href="/bookmaker/18bet/link/">18bet</a>&nbsp;&nbsp;
        </div>
        <span class="ico-bookmarker-info ico-bookmaker-detail">
          <a title="Show more details about 18bet" href="/bookmaker/18bet/"></a>
            </span>
        <span class="ico-bookmarker-info ico-bookmaker-bonus">
          <a onmouseout="globals.getBookmaker(416).cancelBonusOver();" xparam="<div class=&quot;bold&quot;>100% Bonus up to 100€!</div><div>100% first deposit bonus up to 100€! Promocode: WSB100</div>~3" onmouseover="globals.getBookmaker(416).trackBonusOver()" onclick="globals.getBookmaker(416).trackBonusClick();return !window.open(this.href);" href="/bookmaker/18bet/bonus/252"></a>
            </span>
    </td>
    <td class="right odds">
        <div onmouseout="delayHideTip()" onmouseover="page.hist(this,'P-0.00-0-0','2mlnbxv464x0x65lst',416,event,0,1)">2.05</div>
    </td>
    <td class="right odds up">
        <div onmouseout="delayHideTip()" onmouseover="page.hist(this,'P-0.00-0-0','2mlnbxv498x0x0',416,event,0,1)">3.20</div>
    </td>
    <td class="right odds">
        <div onmouseout="delayHideTip()" onmouseover="page.hist(this,'P-0.00-0-0','2mlnbxv464x0x65lsu',416,event,0,1)">3.50</div>
    </td>
    <td class="center info-value"><span>92.1%</span></td>
    <td onmouseout="delayHideTip()" class="check ch3" xparam="The match has already started~2"></td>
</tr>

Спасибо за заранее полученные ответы.

1 Ответ

0 голосов
/ 05 апреля 2019

Здесь примеры того, как вы можете выбрать tr от букмекеров - 18bet .

1 . Найти a с class=name и с text="18bet", получить родителя tr с class=lo:

 //a[@class="name" and .="18bet"]/ancestor::tr[contains(@class, "lo")]

2 . Найти tr с class=lo и ребенком a с class=name и text="18bet":

//tr[contains(@class, "lo") and .//a[@class="name" and .="18bet"]]

1 нечетно: //a[@class="name" and .="18bet"]/ancestor::tr[contains(@class, "lo")]//td[2]

X нечетно: //a[@class="name" and .="18bet"]/ancestor::tr[contains(@class, "lo")]//td[3]

2 нечетно: //a[@class="name" and .="18bet"]/ancestor::tr[contains(@class, "lo")]//td[4]

Payout нечетно: //a[@class="name" and .="18bet"]/ancestor::tr[contains(@class, "lo")]//td[5]


Пример кода Python:

row = driver.find_element_by_xpath('//a[@class="name" and .="18bet"]/ancestor::tr[contains(@class, "lo")]')

odd_1 = row.find_element_by_xpath('.//td[2]')
odd_x = row.find_element_by_xpath('.//td[3]')
odd_2 = row.find_element_by_xpath('.//td[4]')
odd_payout = row.find_element_by_xpath('.//td[5]')
...