抓取动态网页元素

时间:2021-02-06 20:00:50

标签: python selenium xpath css-selectors

我正在尝试从这样的比赛页面中抓取赔率数据: https://www.oddsportal.com/soccer/germany/bundesliga/freiburg-dortmund-WAyMx9XS/#over-under;2

可以看出,此页面允许扩展多个 Over/Under Sections,它们都包含在如下两个动态 URL 后面:

大于/小于 0,5:https://www.oddsportal.com/soccer/germany/bundesliga/freiburg-dortmund-WAyMx9XS/#over-under;2;0.50;0

大于/小于 1:https://www.oddsportal.com/soccer/germany/bundesliga/freiburg-dortmund-WAyMx9XS/#over-under;2;1.00;0

我像这样循环浏览这些不同的页面:

   o_u_types= [0.50,1.00,1.50,1.75,2.00,2.25,2.50,2.75,3.00,3.50,4.00,4.50,5.50,6.50]
            
   for i in o_u_types:
                url_appendix="/#over-under;2;{};0".format(i)
                o_u_type= i
                o_u_match_url= str(link)+str(url_appendix) #Link is the "base link" of the match
                print(o_u_match_url)
                try:
                    self.openmatch(o_u_match_url) #Function to open the resulting match URL
                    time.sleep(1)
                    self.driver.refresh()

现在我想从表格的每一行中检索 Bookmaker、Over 和 Under 的值。问题是包含这些元素的 td 和 tr 元素的 id 随每一行而变化,我无法找出最有效的方法来处理这个.. 以博彩公司为例,我尝试了以下两个(FFI 是一个通过 xpath 查找元素的函数):

 for j in range(1,15): # This serves to loop through each and every possible bookmaker, as the td are increasing up to 15 values within one over/under section

       Book = self.ffi('///*[contains(@id,"table")]/tbody/tr[{}]/td[1]/div/a[2])'.format(j)) # first bookmaker name

       Book=self.driver.find_element_by_css_selector("[id$='odds-data-table']>tbody>tr:nth-of-type({})>td:nth-of-type(2)").format(j)

然而,这些都不会给我带来价值..

到目前为止,唯一对我有用的是:

    for x in range(1,28):
            for j in range(1,15): 
                Book = self.ffi('//*[@id="odds-data-table"]/div[{}]/table/tbody/tr[{}]/td[1]/div/a[2]'.format(x,j)) # first bookmaker name

正如您可能看到的,这会产生很多不必要的循环,因为许多 x,j 组合是不存在的 tr-td 组合,因此返回“无”。这些不必要的循环严重影响了我的程序的性能。

您能帮我找出处理大/小部分中这些不同的 tr、td 数字的正确方法吗? 如果需要,我很乐意提供更多意见!

0 个答案:

没有答案