Beautiful Soup 没有抓取页面中的所有元素
Beautiful Soup not scraping all elements in page
我正在尝试从该投注页面中获取 所有 比赛赔率:
这是控制台显示的内容(第一行和第二行):
我需要刮:
比赛名称即'Palmeiras - Coritiba'等
每行的“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 class odd
,它仅适用于奇数行(具有白色背景的行)。
至于没有获取到<a>
标签的文字,这是由于每行第一列有两个<a>
标签,而你正在阅读的内容造成的第一个,不包含任何文本。
您可以尝试这种方法 - 不用查找行,而是查找第一列(包含匹配名称的 <td>
),然后使用 [=17 查看其兄弟项 <td>
=].
打印匹配名称和“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])
编辑: 此示例打印比赛名称和所有赔率(当 table 包含已完成的比赛时,它还解释了 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'])
我正在尝试从该投注页面中获取 所有 比赛赔率:
这是控制台显示的内容(第一行和第二行):
我需要刮:
比赛名称即'Palmeiras - Coritiba'等
每行的“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 class odd
,它仅适用于奇数行(具有白色背景的行)。
至于没有获取到<a>
标签的文字,这是由于每行第一列有两个<a>
标签,而你正在阅读的内容造成的第一个,不包含任何文本。
您可以尝试这种方法 - 不用查找行,而是查找第一列(包含匹配名称的 <td>
),然后使用 [=17 查看其兄弟项 <td>
=].
打印匹配名称和“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])
编辑: 此示例打印比赛名称和所有赔率(当 table 包含已完成的比赛时,它还解释了 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'])