Hướng dẫn how extract html table from python? - cách trích xuất bảng html từ python?

Tôi đang tìm cách để có được thông tin nhất định từ HTML trong môi trường Linux Shell.

Đây là một chút mà tôi quan tâm:

Tests Failures Success Rate Average Time Min Time Max Time
103 24 76.70% 71 ms 0 ms 829 ms

Và tôi muốn lưu trữ trong các biến shell hoặc lặp lại các trong các cặp giá trị chính được trích xuất từ ​​trên HTML. Thí dụ :

Tests         : 103
Failures      : 24
Success Rate  : 76.70 %
and so on..

Những gì tôi có thể làm tại thời điểm này là tạo một chương trình Java sẽ sử dụng trình phân tích cú pháp SAX hoặc trình phân tích cú pháp HTML như JSOUP để trích xuất thông tin này.

Nhưng sử dụng Java ở đây dường như được sử dụng trên đầu bao gồm các bình Runnable bên trong tập lệnh "trình bao bọc" mà bạn muốn thực thi.

Tôi chắc chắn rằng phải có các ngôn ngữ "shell" ngoài kia có thể thực hiện giống nhau, tức là perl, python, bash, v.v.

Vấn đề của tôi là tôi không có kinh nghiệm với những điều này, ai đó có thể giúp tôi giải quyết vấn đề "khá dễ dàng" này không

Cập nhật nhanh:

Tôi quên đề cập rằng tôi đã có nhiều bảng hơn và nhiều hàng hơn trong tài liệu .html Xin lỗi về điều đó (sáng sớm).

Cập nhật #2:

Đã thử cài đặt BSOUP như thế này vì tôi không có quyền truy cập gốc:

$ wget http://www.crummy.com/software/BeautifulSoup/bs4/download/4.0/beautifulsoup4-4.1.0.tar.gz
$ tar -zxvf beautifulsoup4-4.1.0.tar.gz
$ cp -r beautifulsoup4-4.1.0/bs4 .
$ vi htmlParse.py # (paste code from ) Tichodromas' answer, just in case this (http://pastebin.com/4Je11Y9q) is what I pasted
$ run file (python htmlParse.py)

error:

$ python htmlParse.py
Traceback (most recent call last):
  File "htmlParse.py", line 1, in ?
    from bs4 import BeautifulSoup
  File "/home/gdd/setup/py/bs4/__init__.py", line 29
    from .builder import builder_registry
         ^
SyntaxError: invalid syntax

Cập nhật #3:

Chạy câu trả lời của Tichodromas Nhận lỗi này:

Traceback (most recent call last):
  File "test.py", line 27, in ?
    headings = [th.get_text() for th in table.find("tr").find_all("th")]
TypeError: 'NoneType' object is not callable

Bất kỳ ý tưởng?

Các bảng HTML là một định dạng rất phổ biến để hiển thị thông tin. Khi xây dựng bộ phế liệu, bạn thường cần trích xuất dữ liệu từ bảng HTML và biến nó thành một số định dạng có cấu trúc khác nhau, ví dụ, JSON, CSV hoặc Excel. Trong bài viết này, chúng tôi sẽ nói về việc trích xuất dữ liệu từ bảng HTML trong Python và Scrapy. & NBSP;

Nhưng trước khi chúng tôi bắt đầu, đây là một vài bài viết để xem xét kiến ​​thức cạo râu của bạn:

  1. Web Scraping là gì
  2. Sự khác biệt giữa quét web và thu thập thông tin web là gì

Bây giờ chúng tôi đã rõ ràng về những điều cơ bản, hãy để bắt đầu!

Phần tử bảng HTML đại diện cho dữ liệu bảng và trình bày thông tin theo định dạng hai chiều bao gồm các hàng và cột. Một bảng bắt đầu bằng thẻ theo sau là tiêu đề bảng tùy chọn tiêu đề chứa tiêu đề, chứa thân của bàn và chứa chân trang. Trong bảng, bạn có các hàng được đánh dấu bằng thẻ và bên trong chúng có các ô hoặc thẻ.

Là bảng ví dụ của chúng tôi, chúng tôi sẽ cạo một trang mẫu từ trang web giáo dục của Toscrape.com được ZYTE duy trì cho mục đích thử nghiệm. -https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html

Bảng chứa thông tin UPC, giá, thuế và tính khả dụng.

Hướng dẫn how extract html table from python? - cách trích xuất bảng html từ python?

Để trích xuất một bảng từ HTML, trước tiên bạn cần mở các công cụ nhà phát triển của mình để xem HTML trông như thế nào và xác minh xem nó có thực sự là một bảng chứ không phải một số yếu tố khác. Bạn mở các công cụ của nhà phát triển bằng khóa F12, xem tab Phần tử trực tuyến và làm nổi bật phần tử mà bạn quan tâm. Nguồn HTML của bảng này trông như thế này:

Hướng dẫn how extract html table from python? - cách trích xuất bảng html từ python?

Bây giờ bạn đã xác minh rằng phần tử của bạn thực sự là một bảng và bạn thấy nó trông như thế nào, bạn có thể trích xuất dữ liệu này vào định dạng mong đợi của bạn. & NBSP;

Để đạt được điều này, trước tiên bạn cần tải xuống trang này và sau đó phân tích HTML. Để tải xuống, bạn có thể sử dụng các công cụ khác nhau, chẳng hạn như các yêu cầu Python hoặc Scrapy.

Bàn phân tích sử dụng yêu cầu và súp đẹp

Súp đẹp là một gói Python để phân tích HTML, Python-Rquests là một thư viện máy khách HTTP phổ biến và đơn giản.

Đầu tiên, bạn tải xuống trang bằng cách sử dụng các yêu cầu bằng cách đưa ra yêu cầu HTTP GET. Phương thức phản hồi RAISE_FOR_STATUS () Kiểm tra trạng thái phản hồi để đảm bảo đó là mã 200 và không phải là phản hồi lỗi. Nếu có điều gì đó sai với phản hồi, nó sẽ tăng một ngoại lệ. Nếu tất cả đều tốt, văn bản phản hồi trả về của bạn. & Nbsp;

import requests
from bs4 import BeautifulSoup
def download_page(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.text

Sau đó, bạn phân tích bảng với nội dung văn bản trích xuất đẹp từ mỗi ô và lưu trữ tệp trong JSON

def main(url):
    content = download_page(url)
    soup = BeautifulSoup(content, 'html.parser')
    result = {}
    for row in soup.table.find_all('tr'):
        row_header = row.th.get_text()
        row_cell = row.td.get_text()
        result[row_header] = row_cell
    with open('book_table.json', 'w') as storage_file:
        storage_file.write(json.dumps(result))

Mẫu đầy đủ:

import json
import requests
from bs4 import BeautifulSoup
def download_page(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.text
def main(url):
    content = download_page(url)
    soup = BeautifulSoup(content, 'html.parser')
    result = {}
    for row in soup.table.find_all('tr'):
        row_header = row.th.get_text()
        row_cell = row.td.get_text()
        result[row_header] = row_cell
    with open('book_table.json', 'w') as storage_file:
        storage_file.write(json.dumps(result))
if __name__ == "__main__":
    main("https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html")

Bảng HTML phân tích sử dụng Scrapy & NBSP;

Bạn có thể cạo các bảng từ các trang web bằng cách sử dụng các yêu cầu Python và nó thường có thể hoạt động tốt cho nhu cầu của bạn, nhưng trong một số trường hợp, bạn sẽ cần các công cụ mạnh mẽ hơn. Ví dụ, hãy để nói rằng bạn có 1 nghìn trang sách với các bảng khác nhau và bạn cần phân tích nhanh chúng. Trong trường hợp này, bạn có thể cần phải thực hiện các yêu cầu đồng thời và bạn có thể cần sử dụng một khung không đồng bộ mà giành được chặn luồng thực thi cho mỗi yêu cầu. & NBSP;

Bạn cũng có thể cần xử lý các phản hồi không thành công, giả sử trang web tạm thời giảm và bạn cần thử lại yêu cầu của mình nếu trạng thái phản hồi là 503. Nếu bạn muốn làm điều đó với các yêu cầu Python, bạn sẽ phải thêm một Nếu mệnh đề xung quanh trình tải xuống phản hồi, kiểm tra trạng thái phản hồi và phản hồi lại tải lại nếu xảy ra lỗi. Trong Scrapy, bạn không phải viết bất kỳ mã nào cho việc này vì nó đã được xử lý bởi phần mềm trung gian tải xuống, nó sẽ tự động thử lại các phản hồi không thành công cho bạn mà không cần bất kỳ hành động nào từ phía bạn. & NBSP;

Để trích xuất dữ liệu bảng bằng phế liệu, bạn cần tải xuống và cài đặt phế liệu. Khi bạn đã cài đặt Scrapy, bạn cần tạo một con nhện đơn giản

Sách Scracy Genspider.Toscrape.com

Sau đó, bạn chỉnh sửa mã nhện và bạn đặt logic phân tích cú pháp HTML bên trong phương thức Parse Spider. Phản hồi Scracy phơi bày đối tượng bộ chọn cho phép bạn trích xuất dữ liệu từ nội dung phản hồi bằng cách gọi các phương thức chọn của CSS CSS hoặc XPath Xpath thông qua phản hồi. & NBSP;

import scrapy
class BooksSpider(scrapy.Spider):
    name = 'books'
    allowed_domains = ['toscrape.com']
    start_urls = ['https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html']
    def parse(self, response):
        table = response.css('table')
        result = {}
        for tr in table.css('tr'):
            row_header = tr.css('th::text').get()
            row_value = tr.css('td::text').get()
            result[row_header] = row_value
        yield result

Sau đó, bạn chạy Spider của mình bằng lệnh RunSpider vượt qua đối số -vì đã nói Scrapy để đặt dữ liệu được trích xuất vào tệp input.json. & Nbsp;

Scrapy Runspider Books.py -o Output.json

Bạn sẽ thấy khá nhiều đầu ra nhật ký vì nó sẽ bắt đầu tất cả các công cụ tích hợp trong Scrapy, các bộ phận xử lý thời gian chờ tải xuống, tiêu đề giới thiệu, chuyển hướng, cookie, v.v. đây:

2021-11-25 09:16:19 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)
2021-11-25 09:16:20 [scrapy.core.scraper] DEBUG: Scraped from <200 https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html>
{'UPC': 'a897fe39b1053632', 'Product Type': 'Books', 'Price (excl. tax)': '£51.77', 'Price (incl. tax)': '£51.77', 'Tax': '£0.00', 'Availability': 'In stock (22 available)', 'Number of reviews': '0'}
2021-11-25 09:16:20 [scrapy.core.engine] INFO: Closing spider (finished)

Scrapy sẽ tạo tệp đầu ra tệp.json trong thư mục nơi bạn chạy nhện của mình và nó sẽ xuất dữ liệu trích xuất của bạn vào định dạng JSON và đặt nó vào tệp này.

Sử dụng Python Pandas để phân tích các bảng HTML

Cho đến nay, chúng tôi đã trích xuất một bảng HTML đơn giản, nhưng các bảng trong thế giới thực thường phức tạp hơn. Bạn có thể cần xử lý các bố cục khác nhau và đôi khi sẽ có một số bảng có sẵn trên trang và bạn sẽ cần viết một số bộ chọn để phù hợp với bên phải. Bạn có thể không muốn viết mã phân tích cú pháp cho mỗi bảng bạn thấy. Đố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. & NBSP;

Một phương pháp như vậy có sẵn trong thư viện Python Pandas phổ biến, nó được gọi là read_html (). Phương thức chấp nhận nhiều đối số cho phép bạn tùy chỉnh cách bảng sẽ được phân tích cú pháp.

Bạn có thể gọi phương thức này bằng URL hoặc Tệp hoặc Chuỗi thực tế. & NBSP; Ví dụ: bạn có thể làm điều đó như thế này:

Tests         : 103
Failures      : 24
Success Rate  : 76.70 %
and so on..
0

Trong đầu ra, bạn có thể thấy gấu trúc được tạo ra không chỉ dữ liệu bảng mà cả lược đồ. read_html trả về danh sách các khung dữ liệu gấu trúc và nó cho phép bạn dễ dàng xuất từng dataFrame sang định dạng ưa thích như CSV, XML, tệp Excel hoặc JSON. & NBSP;

Đối với một trường hợp sử dụng đơn giản, đây có thể là lựa chọn dễ nhất cho bạn và bạn cũng có thể kết hợp nó với phế liệu. Bạn có thể nhập gấu trúc trong cuộc gọi lại Scracy và gọi đọc HTML với văn bản phản hồi. Điều này cho phép bạn có một con nhện chung mạnh mẽ xử lý các bảng khác nhau và trích xuất chúng từ các loại trang web khác nhau.

Đó là nó! Trích xuất một bảng HTML từ một trang web rất đơn giản!

Nhưng nếu bạn muốn để lại việc trích xuất dữ liệu nặng nề cho các chuyên gia và có quyền truy cập đơn giản vào dữ liệu ở định dạng ưa thích của bạn, chúng tôi sẽ ở đây cho bạn. Chỉ cần cho chúng tôi một tiếng hét!

Paweł là trưởng nhóm kỹ thuật trong bộ phận giao hàng tại ZYTE, có nhiều năm kinh nghiệm phát triển các giải pháp thu thập thông tin tiên tiến sử dụng khung Scracy, góp phần vào nguồn mở, là một trong những tác giả của Khung Scrapyrt, góp phần làm nổi bật.

Làm thế nào trích xuất dữ liệu bảng HTML từ Python?

Để trích xuất một bảng từ HTML, trước tiên bạn cần mở các công cụ nhà phát triển của mình để xem HTML trông như thế nào và xác minh xem nó có thực sự là một bảng chứ không phải một số yếu tố khác.Bạn mở các công cụ của nhà phát triển bằng khóa F12, xem tab Phần tử trực tuyến và làm nổi bật phần tử mà bạn quan tâm.open developer tools with the F12 key, see the “Elements” tab, and highlight the element you're interested in.

Pandas có thể đọc bảng HTML không?

Hàm Pandas Read_HTML sẽ trích xuất dữ liệu từ các bảng HTML và trả về danh sách tất cả các bảng.Lưu ý rằng chức năng Pandas Read_HTML trả về một danh sách các đối tượng DataFrame của Pandas.. Note that pandas read_html function returns a list of Pandas DataFrame objects.