Làm cách nào để chuyển đổi HTML sang CSV bằng Python?

Một trong những nhiệm vụ khó khăn nhất đối với nhà khoa học dữ liệu là thu thập dữ liệu. Mặc dù thực tế là có rất nhiều dữ liệu có sẵn trên web nhưng nó chỉ trích xuất dữ liệu thông qua tự động hóa

Giới thiệu

Tôi muốn trích xuất dữ liệu hoạt động cơ bản được nhúng trong bảng HTML từ https. //www. hướng dẫn. com/python/python_basic_operators. htm

Hmmm, dữ liệu nằm rải rác trong nhiều bảng HTML, nếu chỉ có một bảng HTML thì rõ ràng tôi có thể sử dụng Copy & Paste để. tệp csv

Tuy nhiên, nếu có nhiều hơn 5 bảng trong một trang thì rõ ràng là rất khó. Phải không?

Làm thế nào để làm nó

1. Tôi sẽ nhanh chóng chỉ cho bạn cách tạo tệp csv dễ dàng nếu bạn muốn tạo tệp csv

import csv
# Open File in Write mode , if not found it will create one
File = open('test.csv', 'w+')
Data = csv.writer(File)

# My Header
Data.writerow(('Column1', 'Column2', 'Column3'))

# Write data
for i in range(20):
Data.writerow((i, i+1, i+2))

# close my file
File.close()

đầu ra

Đoạn mã trên khi được thực thi sẽ tạo ra một bài kiểm tra. csv trong cùng thư mục với mã này

Làm cách nào để chuyển đổi HTML sang CSV bằng Python?

2. Bây giờ chúng ta hãy lấy một bảng HTML từ https. //www. hướng dẫn. com/python/python_dictionary. htm và viết nó dưới dạng tệp CSV

Bước đầu tiên là thực hiện nhập khẩu

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = 'https://www.tutorialspoint.com/python/python_dictionary.htm'
  • Mở tệp HTML và lưu trữ nó trong đối tượng html bằng urlopen

đầu ra

html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
  • Tìm các bảng bên trong bảng html và Hãy để chúng tôi mang dữ liệu bảng. Đối với mục đích trình diễn, tôi sẽ chỉ trích xuất bảng đầu tiên [0]

    Tiết lộ. Bài đăng này có thể chứa các liên kết liên kết, nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi sẽ nhận được hoa hồng

    Bạn đã bao giờ muốn tự động trích xuất các bảng HTML từ các trang web và lưu chúng ở định dạng phù hợp trên máy tính của mình chưa? . Trong hướng dẫn này, chúng tôi sẽ sử dụng các yêu cầu và thư viện BeautifulSoup để chuyển đổi bất kỳ bảng nào trên bất kỳ trang web nào và lưu nó trên đĩa của chúng tôi

    Chúng tôi cũng sẽ sử dụng gấu trúc để dễ dàng chuyển đổi sang định dạng CSV (hoặc bất kỳ định dạng nào mà gấu trúc hỗ trợ). Nếu bạn chưa cài đặt BeautifulSoup và pandas, hãy cài đặt chúng bằng lệnh sau

    pip3 install requests bs4 pandas

    Nếu bạn muốn làm theo cách khác, chuyển đổi khung dữ liệu Pandas thành bảng HTML, hãy xem hướng dẫn này

    Mở một tệp Python mới và làm theo. Hãy nhập các thư viện

    import requests
    import pandas as pd
    from bs4 import BeautifulSoup as bs

    Chúng tôi cần một chức năng chấp nhận URL mục tiêu và cung cấp cho chúng tôi đối tượng súp thích hợp

    USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
    # US english
    LANGUAGE = "en-US,en;q=0.5"
    
    def get_soup(url):
        """Constructs and returns a soup using the HTML content of `url` passed"""
        # initialize a session
        session = requests.Session()
        # set the User-Agent as a regular browser
        session.headers['User-Agent'] = USER_AGENT
        # request for english content (optional)
        session.headers['Accept-Language'] = LANGUAGE
        session.headers['Content-Language'] = LANGUAGE
        # make the request
        html = session.get(url)
        # return the soup
        return bs(html.content, "html.parser")

    Trước tiên, chúng tôi khởi tạo một phiên yêu cầu, chúng tôi sử dụng tiêu đề Tác nhân người dùng để cho biết rằng chúng tôi chỉ là một trình duyệt thông thường chứ không phải bot (một số trang web chặn chúng), sau đó chúng tôi nhận nội dung HTML bằng phiên. phương thức nhận (). Sau đó, chúng tôi xây dựng một đối tượng BeautifulSoup bằng html. trình phân tích cú pháp

    hướng dẫn liên quan. Cách tạo một trình trích xuất email bằng Python

    Vì chúng tôi muốn trích xuất mọi bảng trong bất kỳ trang nào, chúng tôi cần tìm thẻ HTML của bảng và trả lại. Hàm sau thực hiện chính xác điều đó

    def get_all_tables(soup):
        """Extracts and returns all tables in a soup object"""
        return soup.find_all("table")

    Bây giờ chúng tôi cần một cách để lấy tiêu đề bảng, tên cột hoặc bất cứ thứ gì bạn muốn gọi chúng

    def get_table_headers(table):
        """Given a table soup, returns all the headers"""
        headers = []
        for th in table.find("tr").find_all("th"):
            headers.append(th.text.strip())
        return headers

    Hàm trên tìm hàng đầu tiên của bảng và trích xuất tất cả các thẻ thứ (tiêu đề bảng)

    Bây giờ chúng ta đã biết cách trích xuất các tiêu đề của bảng, việc còn lại là trích xuất tất cả các hàng của bảng

    ________số 8_______

    Tất cả các chức năng trên đang thực hiện, là tìm các thẻ tr (các hàng của bảng) và trích xuất các phần tử td, sau đó nối chúng vào danh sách. Lý do chúng tôi sử dụng bảng. find_all("tr")[1. ] chứ không phải tất cả các thẻ tr, bởi vì thẻ tr đầu tiên tương ứng với các tiêu đề của bảng;

    Hàm dưới đây lấy tên bảng, tiêu đề bảng và tất cả các hàng và lưu chúng dưới dạng định dạng CSV

    def save_as_csv(table_name, headers, rows):
        pd.DataFrame(rows, columns=headers).to_csv(f"{table_name}.csv")

    Bây giờ chúng ta đã có tất cả các hàm cốt lõi, hãy kết hợp tất cả chúng lại với nhau trong hàm

    import requests
    import pandas as pd
    from bs4 import BeautifulSoup as bs
    0

    def main(url):
        # get the soup
        soup = get_soup(url)
        # extract all the tables from the web page
        tables = get_all_tables(soup)
        print(f"[+] Found a total of {len(tables)} tables.")
        # iterate over all tables
        for i, table in enumerate(tables, start=1):
            # get the table headers
            headers = get_table_headers(table)
            # get all the rows of the table
            rows = get_table_rows(table)
            # save table as csv file
            table_name = f"table-{i}"
            print(f"[+] Saving {table_name}")
            save_as_csv(table_name, headers, rows)

    Hàm trên thực hiện như sau

    • Phân tích cú pháp nội dung HTML của trang web được cung cấp URL của nó bằng cách xây dựng đối tượng BeautifulSoup
    • Tìm tất cả các bảng trên trang HTML đó
    • Lặp lại tất cả các bảng được trích xuất này và lưu từng bảng một

    Cuối cùng, hãy gọi chức năng chính

    if __name__ == "__main__":
        import sys
        try:
            url = sys.argv[1]
        except IndexError:
            print("Please specify a URL.\nUsage: python html_table_extractor.py [URL]")
            exit(1)
        main(url)

    Điều này sẽ chấp nhận URL từ các đối số dòng lệnh, hãy thử xem điều này có hoạt động không

    C:\pythoncode-tutorials\web-scraping\html-table-extractor>python html_table_extractor.py https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population
    [+] Found a total of 2 tables.
    [+] Saving table-1
    [+] Saving table-2

    Tốt, hai tệp CSV đã xuất hiện trong thư mục hiện tại của tôi tương ứng với hai bảng trong trang Wikipedia đó, đây là một phần của một trong các bảng được trích xuất

    Làm cách nào để chuyển đổi HTML sang CSV bằng Python?

    Đáng kinh ngạc. Chúng tôi đã tạo thành công tập lệnh Python để trích xuất bất kỳ bảng nào từ bất kỳ trang web nào, thử chuyển các URL khác và xem nó có hoạt động không

    Đối với các trang web dựa trên Javascript (tải động dữ liệu trang web bằng Javascript), hãy thử sử dụng thư viện request-html hoặc Selenium để thay thế. Hãy cho chúng tôi xem những gì bạn đã làm trong phần bình luận bên dưới

    Bạn cũng có thể tạo trình thu thập dữ liệu web tải xuống tất cả các bảng từ toàn bộ trang web. Bạn có thể làm điều đó bằng cách trích xuất tất cả các liên kết trang web và chạy tập lệnh này trên từng URL mà bạn nhận được từ đó

    Ngoài ra, nếu vì bất kỳ lý do gì, trang web bạn đang cạo chặn địa chỉ IP của bạn, bạn cần sử dụng một số máy chủ proxy làm biện pháp đối phó

    Cuối cùng, nếu bạn là người mới bắt đầu và muốn học Python, tôi khuyên bạn nên tham gia khóa học Python For Everyone Coursera, trong đó bạn sẽ học được nhiều điều về Python. Bạn cũng có thể xem trang tài nguyên và khóa học của chúng tôi để xem các tài nguyên Python mà tôi đề xuất về các chủ đề khác nhau

    Làm cách nào để chuyển đổi mã HTML sang CSV?

    Cách chuyển đổi HTML sang CSV .
    Tải (các) tệp html lên Chọn tệp từ Máy tính, Google Drive, Dropbox, URL hoặc bằng cách kéo tệp trên trang
    Chọn "sang csv" Chọn csv hoặc bất kỳ định dạng nào khác mà bạn cần (hơn 200 định dạng được hỗ trợ)
    Tải xuống csv của bạn

    Làm cách nào để chuyển đổi bảng HTML thành DataFrame trong Python?

    Sử dụng Python, hãy cho chúng tôi hiểu cách chuyển đổi bảng HTML thành khung dữ liệu gấu trúc. HTML cung cấp cho chúng ta thẻ Thư viện Pandas có chức năng read_html() để nhập dữ liệu vào khung dữ liệu .

    Làm cách nào để lấy dữ liệu từ bảng HTML trong Python?

    Đối với điều này, bạn có thể sử dụng các thư viện python khác nhau giúp bạn trích xuất nội dung từ bảng HTML. Một phương thức như vậy có sẵn trong thư viện Python Pandas phổ biến, nó được gọi là read_html() .