Súp Scraping đẹp mắt

Sep 30 2020

Tôi đang gặp sự cố với mã làm việc cũ không hoạt động chính xác nữa.

Mã python của tôi đang quét một trang web bằng cách sử dụng súp đẹp và trích xuất dữ liệu sự kiện (ngày, sự kiện, liên kết).

Mã của tôi đang kéo tất cả các sự kiện nằm trong tbody. Mỗi sự kiện được lưu trữ trong a <tr class="Box">. Vấn đề là trình <tr style ="box-shadow: none;>thu thập dữ liệu của tôi dường như dừng lại sau khi này Sau khi nó đến phần này (là phần chứa 3 quảng cáo trên trang web cho các sự kiện mà tôi không muốn cạo) mã ngừng kéo dữ liệu sự kiện từ bên trong <tr class="Box">. Có cách nào để bỏ qua kiểu tr này / bỏ qua các trường hợp trong tương lai không?

import pandas as pd
import bs4 as bs
from bs4 import BeautifulSoup
import urllib.request
import warnings
warnings.filterwarnings("ignore", category=UserWarning, module='bs4')

source = urllib.request.urlopen('https://10times.com/losangeles-us/technology/conferences').read()
soup = bs.BeautifulSoup(source,'html.parser')
   #---Get Event Data---
    test1=[]
    table = soup.find('tbody')
    table_rows = table.find_all('tr') #find table rows (tr)
    for x in table_rows:   
        data = x.find_all('td')  #find table data
        row = [x.text for x in data]
        if len(row) > 2: #Exlcudes rows with only event name/link, but no data.
            test1.append(row)
test1

Trả lời

2 AndrejKesely Sep 30 2020 at 01:56

Dữ liệu được tải động qua JavaScript, vì vậy bạn không thấy thêm kết quả. Bạn có thể sử dụng ví dụ này để tải nhiều trang hơn:

import requests
from bs4 import BeautifulSoup


url = "https://10times.com/ajax?for=scroll&path=/losangeles-us/technology/conferences"
params = {"page": 1, "ajax": 1}
headers = {"X-Requested-With": "XMLHttpRequest"}

for params["page"] in range(1, 4):  # <-- increase number of pages here
    print("Page {}..".format(params["page"]))
    soup = BeautifulSoup(
        requests.get(url, headers=headers, params=params).content,
        "html.parser",
    )
    for tr in soup.select('tr[class="box"]'):
        tds = [td.get_text(strip=True, separator=" ") for td in tr.select("td")]
        print(tds)

Bản in:

Page 1..
['Tue, 29 Sep - Thu, 01 Oct 2020', 'Lens Los Angeles', 'Intercontinental Los Angeles Downtown, Los Angeles', 'LENS brings together the entire Degreed community - our clients, invited prospective clients, thought leaders, partners, employees, executives, and industry experts for two days of discussion, workshops,...', 'Business Services IT & Technology', 'Interested']
['Wed, 30 Sep - Sat, 03 Oct 2020', 'FinCon', 'Long Beach Convention & Entertainment Center, Long Beach 20.1 Miles from Los Angeles', 'FinCon will be helping financial influencers and brands create better content, reach their audience, and make more money. Collaborate with other influencers who share your passion for making personal finance...', 'Banking & Finance IT & Technology', 'Interested 7 following']
['Mon, 05  - Wed, 07 Oct 2020', 'NetDiligence Cyber Risk Summit', 'Loews Santa Monica Beach Hotel, Santa Monica 14.6 Miles from Los Angeles', 'NetDiligence Cyber Risk Summit will conference are attended by hundreds of cyber risk insurance, legal/regulatory and security/privacy technology leaders from all over the world. Connect with leaders in...', 'IT & Technology', 'Interested']

... etc.