find_next不能捕获所有<div>实例

时间:2019-09-08 08:17:54

标签: python html web-scraping beautifulsoup

我遇到一个问题,即并非所有实例都在相对简单的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

3 个答案:

答案 0 :(得分: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 > div'),它与:

相同
  • 找到ID为div的{​​{1}}块
  • 并选择所有team_stats_extra的直属孩子

答案 1 :(得分:1)

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())

答案 2 :(得分:1)

对于bs4 4.7.1+,您可以使用:has来确保以th类获得适当的div,因此您有适当的元素可以循环使用

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())