【问题标题】:Beautiful Soup not scraping all elements in page美丽的汤没有刮掉页面中的所有元素
【发布时间】:2020-10-14 18:56:49
【问题描述】:

我正在尝试从该投注页面获取所有匹配赔率:

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

我需要刮:

  1. 比赛名称,即“Palmeiras - Coritiba”等

  2. 每行的“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”文本。

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

【问题讨论】:

  • @你在使用哪些库? browser 是什么?
  • 我正在使用 splinter / selenium。请参考我的编辑
  • 我不知道什么是 splinter 但试试el.find('td/a')

标签: python beautifulsoup splinter


【解决方案1】:

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

至于没有得到&lt;a&gt;标签的文本,这是因为每一行的第一列有两个&lt;a&gt;标签,而你正在阅读第一个标签的内容,这确实不包含任何文字。

您可以尝试这种方法 - 不要查找行,而是查找第一列(包含匹配名称的 &lt;td&gt;),然后使用 findNext 查看其兄弟&lt;td&gt;

打印匹配名称和列“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'])

【讨论】:

  • 不错……还有其他栏目?
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 2021-01-15
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2020-12-13
  • 2019-03-13
相关资源
最近更新 更多