【问题标题】:find_next not capturing all <div> instancesfind_next 未捕获所有 <div> 实例
【发布时间】:2020-01-10 09:48:03
【问题描述】:

我遇到了一个问题,即并非所有实例都在相对简单的 beautifulsoup 抓取中捕获。我正在运行的是以下内容:

from bs4 import BeautifulSoup as bsoup
import requests as reqs

home_test = "https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two"
away_test = "https://fbref.com/en/matches/ea736ad1/Carlisle-United-Northampton-Town-August-11-2018-League-Two"

page_to_parse = home_test

page = reqs.get(page_to_parse)
status_code = page.status_code
status_code = str(status_code)
parse_page = bsoup(page.content, 'html.parser')

find_stats = parse_page.find_all('div',id="team_stats_extra")
print(find_stats)
for stat in find_stats:
    add_stats = stat.find_next('div').get_text()
    print(add_stats)

如果您查看第一次打印,则抓取会捕获我所追求的网站部分,但是如果您检查第二次打印,则实际上并没有处理较早的一半实例一点也不。我对此没有任何限制,所以理论上它应该包含所有正确的。

我已经测试了很多不同的 find_next、find 或 find_all 变体,但第二个循环 find 永远不会使用所有这些变体。

结果总是:

Northampton Lincoln City
12Fouls13
6Corners1
7Crosses2
89Touches80

它应该采取以下措施:

Northampton Lincoln City
12Fouls13
6Corners1
7Crosses2
89Touches80

Northampton Lincoln City
2Offsides2
9Goal Kicks15
32Throw Ins24
18Long Balls23

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    find_stats = parse_page.find_all('div',id="team_stats_extra")实际上只返回一个块,所以下一个循环只执行一次迭代。

    您可以更改选择 div 块的方式:

    find_stats = parse_page.select('div#team_stats_extra > div')
    
    print(len(find_stats))  # >>> returns 2
    
    for stat in find_stats:
        add_stats = stat.get_text()
        print(add_stats)
    

    解释选择器select('div#team_stats_extra &gt; div'),同:

    • 找到ID为team_stats_extradiv
    • 并选择所有div 的直接子代

    【讨论】:

      【解决方案2】:

      parse_page.find_all 返回一个项目列表,即带有id="team_stats_extra" 的WebElement。循环需要在它的子元素上

      find_stats = parse_page.find_all('div', id="team_stats_extra")
      all_stats = find_stats[0].find_all('div', recursive=False)
      for stat in all_stats:
          print(stat.get_text())
      

      如果您有多个表,请使用两个循环

      find_stats = parse_page.find_all('div', id="team_stats_extra")
      for stats in find_stats:
          all_stats = stats.find_all('div', recursive=False)
          for stat in all_stats:
              print(stat.get_text())
      

      【讨论】:

      • 这非常有效,谢谢!为什么它最初不起作用是有道理的。
      【解决方案3】:

      在 bs4 4.7.1+ 中,您可以使用 :has 来确保您获得适当的 div 类 th 作为孩子,这样您就有适当的元素可以循环

      import requests
      from bs4 import BeautifulSoup as bs
      
      r = requests.get('https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two')
      soup = bs(r.content, 'lxml')
      
      for div in soup.select('#team_stats_extra div:has(.th)'):
          print(div.get_text())
      

      【讨论】:

        猜你喜欢
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 2021-12-28
        • 2013-12-27
        相关资源
        最近更新 更多