美丽的汤不刮页面中的所有元素

问题描述

我正在尝试从此投注页面中刮除所有赔率:

enter image description here

这是控制台向我显示内容(第一行和第二行):

enter image description here

我需要刮擦:

  1. 比赛名称,例如'Palmeiras-Coritiba'等

  2. 每行的
  3. 列“ 1”,“ X”列和“ 2”列值。

到目前为止,我有以下代码

from splinter import browser
from bs4 import BeautifulSoup

executable_path = {"executable_path": "/path/to/geckodriver"}
browser = browser("firefox",**executable_path,headless=True,incognito=True)

bets = f'https://www.oddsportal.com/soccer/brazil/serie-a/'
browser.visit(bets)
# parse html
soup = BeautifulSoup(browser.html,'html.parser')

odds = soup.find_all('tr',class_="odd")
for el in odds:
    print (el.find('a').contents[0])
    print (el.find('td',class_='odds-Nowrp'))

但我在9行中仅得到6列的“ 1”值:

<td class="odds-Nowrp" xodd="1.52" xoid="E-3pdmnxv464x0x9vma2"><a href="" onclick="globals.ch.togle(this,'E-3pdmnxv464x0x9vma2');return false;" xparam="odds_text">1.52</a></td>
 
<td class="odds-Nowrp" xodd="1.9" xoid="E-3pdmoxv464x0x9vma4"><a href="" onclick="globals.ch.togle(this,'E-3pdmoxv464x0x9vma4');return false;" xparam="odds_text">1.90</a></td>
 
<td class="odds-Nowrp" xodd="2.17" xoid="E-3pdmsxv464x0x9vmac"><a href="" onclick="globals.ch.togle(this,'E-3pdmsxv464x0x9vmac');return false;" xparam="odds_text">2.17</a></td>
 
<td class="odds-Nowrp" xodd="4.24" xoid="E-3pdmrxv464x0x9vmaa"><a href="" onclick="globals.ch.togle(this,'E-3pdmrxv464x0x9vmaa');return false;" xparam="odds_text">4.24</a></td>
 
<td class="odds-Nowrp" xodd="2.49" xoid="E-3pdmuxv464x0x9vmag"><a href="" onclick="globals.ch.togle(this,'E-3pdmuxv464x0x9vmag');return false;" xparam="odds_text">2.49</a></td>
 
<td class="odds-Nowrp" xodd="4.08" xoid="E-3pdn3xv464x0x9vmaq"><a href="" onclick="globals.ch.togle(this,'E-3pdn3xv464x0x9vmaq');return false;" xparam="odds_text">4.08</a></td>

而且我没有收到想要的'a'文字

如何获取页面上所有列的值和文本的匹配项?

解决方法

由于选择器,您无法获得所有行。您正在使用css类odd,该类仅适用于奇数行(背景为白色的行)。

关于未获取<a>标签的文本,这是由于以下事实造成的:每行第一列中有两个<a>标签,而您正在读取第一行的内容一个,不包含任何文本。

您可以尝试这种方法-而不是寻找行,而是寻找第一列(包含匹配名称的<td>),然后使用<td>查看其同级findNext

打印匹配名称和“ 1”列的值的示例:

odds = soup.find_all('td',class_="name table-participant")
for el in odds:
    print (el.find('a').findNext('a').contents[0])
    print (el.findNext('td').find('a').contents[0])

编辑:此示例显示匹配名称和所有赔率(当表格包含已完成的匹配时,也说明html结构的变化):

odds = soup.find_all('td',class_="name table-participant")
for el in odds:
    links_in_first_column = el.find_all('a')
    match_name = ''.join(map(lambda e : e.text.strip(),links_in_first_column))
    print(match_name)

    odds_columns = el.find_next_siblings('td',xodd=True)
    print (odds_columns[0]['xodd'])
    print (odds_columns[1]['xodd'])
    print (odds_columns[2]['xodd'])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...