Pertanyaan Python - Tidak Dapat Mengambil Data Dari Halaman Web Tabel Menggunakan Sup Indah atau lxml xpath


Saya mencoba mengambil data dari "Statistik Skor Tingkat Lanjut" dari halaman web berikut: http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html

Saya mencoba menggunakan BeautifulSoup dengan cara yang sangat luas untuk mengambil semua tabel:

import requests
from bs4 import BeautifulSoup

base_url = "http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html"
r = requests.get(base_url)
soup = BeautifulSoup(r.text, "html.parser")
tables = soup.find_all("table")
for table in tables:
       print table.get_text()

Dengan demikian, hanya diambil "Statistik Skor Kotak Dasar". Namun, itu tidak mengambil "Statistik Skor Tingkat Lanjut" seperti yang saya harapkan.

Selanjutnya, saya mencoba untuk lebih spesifik dengan menggunakan lxml path:

import requests
from lxml import html
page = requests.get('http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html')
tree = html.fromstring(page.content)
boxscore_Advanced = tree.xpath('//*[@id="box-score-advanced-lafayette"]/tbody/tr[1]/td[1]/text()’)
print boxscore_Advanced

Dengan demikian, ia mengembalikan daftar kosong.

Saya telah berjuang dengan ini untuk waktu yang cukup lama, dan telah mencoba memecahkan masalah ini dengan menggunakan posting berikut:

Terima kasih sebelumnya atas semua dan semua bantuan!


4
2018-01-09 19:25


asal


Jawaban:


Tidak perlu digunakan selenium dan / atau PhantomJS. Tabel "Tingkat Statistik Skor Lanjut" sebenarnya berada di dalam HTML, mereka hanya di dalam komentar HTML. Uraikan mereka:

import requests
from bs4 import BeautifulSoup, Comment


url = "http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")

# find the comments containing the desired tables
tables = soup.find_all(text=lambda text: text and isinstance(text, Comment) and 'Advanced Box Score Stats' in text)

# we have 2 tables - one for an opponent team
for table in tables:
    table_soup = BeautifulSoup(table, "html.parser")
    advanced_table = table_soup.select_one("table[id^=box-score-advanced]")
    for row in advanced_table("tr")[2:]:  # skip headers
        print(row.th.get_text())
    print("-------")

Mencetak nama pemain dari kolom pertama tabel lanjutan:

Nick Lindner
Monty Boykins
Matt Klinewski
Paulius Zalys
Auston Evans
Reserves
Myles Cherry
Kyle Stout
Eric Stafford
Lukas Jarrett
Hunter Janacek
Jimmy Panzini
School Totals
-------
Kris Jenkins
Phil Booth
Josh Hart
Jalen Brunson
Darryl Reynolds
Reserves
Donte DiVincenzo
Mikal Bridges
Eric Paschall
Tim Delaney
Dylan Painter
Denny Grace
Tom Leibig
Matt Kennedy
School Totals
-------

4
2018-01-09 20:44



@snakecharmerb berada di jalur yang benar: tabel ini tidak ada di html mentah dan harus ditambahkan oleh Javascript pada saat runtime.

Melakukan hal ini:

$ curl http://www.sports-reference.com/cbb/boxscores/2016-11-11-villanova.html | grep "box-score-advanced-lafayette"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9891    0  9891    0     0  45371      0 --:--:-- --:--:-- --:--:-- 48965<div id="all_box-score-advanced-lafayette" class="table_wrapper setup_commented commented">
  <span class="section_anchor" id="box-score-advanced-lafayette_link" data-label="Advanced Box Score"></span>
      <div class="overthrow table_container" id="div_box-score-advanced-lafayette">
  <table class="sortable stats_table" id="box-score-advanced-lafayette" data-cols-to-freeze=1><caption>&nbsp; Table</caption>
100  141k    0  141k    0     0   349k      0 --:--:-- --:--:-- --:--:--  363k

Anda melihat dari output bahwa semua yang ada di html adalah wadah yang dibangun oleh tabel.

Untuk menggores sesuatu seperti ini, saya merekomendasikan pendekatan seperti Phantom.js http://phantomjs.org


2
2018-01-09 19:53