2017-07-02 33 views
6

Tôi hiện đang cố gắng thực hành với các yêu cầu và mô-đun BeautifulSoup trong Python 3.6 và gặp phải vấn đề mà tôi dường như không tìm thấy bất kỳ thông tin nào về các câu hỏi và câu trả lời khác.Súp đẹp không thể tìm thấy thẻ

Dường như tại một số thời điểm trong trang, Beuatiful Soup ngừng nhận dạng thẻ và Id. Tôi cố gắng để kéo Play-by-play dữ liệu từ một trang như thế này:

http://www.pro-football-reference.com/boxscores/201609080den.htm

import requests, bs4 

source_url = 'http://www.pro-football-reference.com/boxscores/201609080den.htm' 
res = requests.get(source_url) 
if '404' in res.url: 
    raise Exception('No data found for this link: '+source_url) 

soup = bs4.BeautifulSoup(res.text,'html.parser') 

#this works 
all_pbp = soup.findAll('div', {'id' : 'all_pbp'}) 
print(len(all_pbp)) 

#this doesn't 
table = soup.findAll('table', {'id' : 'pbp'}) 
print(len(table)) 

Sử dụng thanh tra trong Chrome, tôi có thể thấy rằng bàn chắc chắn tồn tại. Tôi cũng đã cố gắng sử dụng nó trên 'div's và' tr's trong nửa sau của HTML và nó dường như không hoạt động. Tôi đã thử tiêu chuẩn 'html.parser' cũng như lxml và html5lib, nhưng không có gì có vẻ hiệu quả.

Tôi có làm điều gì đó sai ở đây hoặc có điều gì đó trong HTML hoặc định dạng của nó ngăn cản BeautifulSoup tìm chính xác các thẻ sau này không? Tôi đã gặp sự cố với các trang tương tự do công ty này điều hành (hockey-reference.com, basketball-reference.com), nhưng đã có thể sử dụng các công cụ này đúng cách trên các trang web khác.

Nếu nó là thứ gì đó với HTML, có công cụ/thư viện nào tốt hơn để giúp trích xuất thông tin này không?

Cảm ơn bạn đã giúp đỡ của bạn, BF

+0

chính xác những gì bạn muốn phân tích cú pháp từ bảng đó? Tất cả bảng? chỉ một số cột? một số tế bào? –

+0

câu lệnh của bạn 'table = soup.findAll ('table', {'id': 'pbp'})' không _không hoạt động_, nó chỉ đơn giản là không tìm thấy các phần tử 'div' với' id = pbp' –

+0

@DmitriyFialkovskiy Tôi đang cố gắng để tạo ra một tập tin excel của các vở kịch từ các trò chơi cụ thể. Một khi tôi có thể không canh trong bảng đó, tôi tự tin tôi có thể lặp lại thông qua các thẻ tr và td để có được văn bản ra khỏi nó và sử dụng openpyxl để làm cho nó thành excel. Tôi đoán cuối cùng câu hỏi của tôi là tại sao không bs4 tìm thấy thẻ trong html. Có vẻ như bs4 có thể tìm thấy bất kỳ thẻ nào trước khi nhận xét trong html nhưng không sau - nhận xét có ảnh hưởng đến phân tích cú pháp không? có cách nào để kéo thẻ từ sau nhận xét đó một cách chính xác không? –

Trả lời

1

BS4 sẽ không thể thực hiện javascript của một trang web sau khi thực hiện yêu cầu GET cho một URL. Tôi nghĩ rằng bảng quan tâm được tải không đồng bộ từ javascript phía máy khách.

Do đó, javascript phía máy khách sẽ cần phải chạy trước trước khi loại bỏ HTML. Điều này post mô tả cách làm như vậy!

+0

Cảm ơn một lần nữa, đó là vấn đề. Chơi xung quanh với Dryscrape đã giúp. Tôi đoán tôi có một thư viện khác để thêm vào danh sách những điều cần học. –

0

Ok, tôi có vấn đề là gì. Bạn đang cố gắng phân tích cú pháp nhận xét, không phải là phần tử html thông thường. Đối với những trường hợp này bạn nên sử dụng Comment từ BeautifulSoup, như thế này:

import requests 
from bs4 import BeautifulSoup,Comment 

source_url = 'http://www.pro-football-reference.com/boxscores/201609080den.htm' 
res = requests.get(source_url) 
if '404' in res.url: 
    raise Exception('No data found for this link: '+source_url) 

soup = BeautifulSoup(res.content,'html.parser') 

comments=soup.find_all(string=lambda text:isinstance(text,Comment)) 

for comment in comments: 
    comment=BeautifulSoup(str(comment), 'html.parser') 
    search_play = comment.find('table', {'id':'pbp'}) 
    if search_play: 
     play_to_play=search_play 
+0

@Big Fore, mọi phản hồi? câu trả lời của tôi có giúp ích gì không? –

+0

Câu trả lời của bạn chắc chắn hữu ích trong quá trình học tập của tôi, nhưng không phải là giải pháp cho vấn đề cụ thể mà tôi có. Vấn đề của tôi là tìm thấy bất kỳ thẻ nào sau khi nhận xét. Nó chỉ ra HTML tôi đã xem trong trình duyệt sau khi nhận xét được tải qua javascript vì vậy không được hiển thị trong văn bản yêu cầu, nhưng cần thêm một thư viện để phân tích cú pháp. Cảm ơn sự giúp đỡ của bạn Dmitry –

+0

không hiểu bạn hoàn toàn - mục đích của bạn là bắt chính nhận xét bằng văn bản hoặc thẻ của nó _after_ nhận xét cụ thể? –

Các vấn đề liên quan