Cách lấy dữ liệu từ bảng html trong selen python

điểm. 0

Bạn đã đặt biến khớp với nguồn trang nhưng chưa sử dụng nó

match = browser.page_source
if "deactivateOdd" in match:
   #do something
else:
   #do something else

Tôi khá chắc chắn rằng đây là lý do khiến các yếu tố của bạn không hiển thị

Phần này sẽ làm nổi bật hai trường hợp sử dụng để chứng minh việc sử dụng các phương pháp find_elements_by khác nhau. Thông thường, chúng tôi muốn cạo dữ liệu từ các bảng hoặc văn bản bài viết. Do đó, hai bản trình diễn bao gồm các trường hợp sử dụng này

Hãy để chúng tôi kiểm tra trang web trực tiếp này của một bài báo trực tuyến. Bài viết trên trang này có nhiều tiểu mục, mỗi tiểu mục có nhiều đoạn văn và thậm chí có cả gạch đầu dòng. Giả sử rằng chúng tôi muốn cạo toàn bộ văn bản của bài báo. Một cách thú vị để làm điều đó là cạo tất cả các tiểu mục riêng biệt trước và sau đó nối chúng lại với nhau. Ưu điểm của cách làm này là chúng ta cũng có thể lấy văn bản của từng tiểu mục

Hãy để chúng tôi Inspect trang web này. Hãy để chúng tôi di chuyển con trỏ đến phần tử DOM xác định khu vực nội dung bài viết. Dưới chỗ này

phần tử, chúng ta có thể thấy rằng các tiêu đề tiểu mục có tất cả các tên thẻ bắt đầu bằng "h", các đoạn văn có một

tên thẻ và các phần dấu đầu dòng có

    tên thẻ. Các phần tử có các tên thẻ này đều song song với nhau, thay vì được nhúng trong cấu trúc phân cấp. Thiết kế này quy định rằng chúng ta không nên viết một vòng lặp trong tập lệnh của mình để truy cập chúng, chẳng hạn như để truy cập từng đoạn trong tiểu mục. Một điểm khác cần lưu ý là ở đây chúng tôi sử dụng từ điển Python để lưu trữ văn bản của từng tiểu mục. Đối với mỗi cặp khóa-giá trị trong từ điển này, khóa lưu trữ tiêu đề tiểu mục và giá trị lưu trữ các đoạn văn bản của nó. Vì vậy, đây là một cấu trúc dữ liệu thuận tiện để sử dụng cho trường hợp sử dụng này. Chương trình sau đây thực hiện chiến lược của chúng tôi ở trên để cạo toàn bộ văn bản của bài báo

    # same as the set up chunk of code
    ...
    journalAddress = "https://www.federalregister.gov/documents/2013/09/24/2013-21228/affirmative-action-and-nondiscrimination-obligations-of-contractors-and-subcontractors-regarding"
    # same as the set up chunk of code
    ...
    time.sleep(2)
    
    articleObjects = driver.find_elements_by_xpath('//div[@id="fulltext_content_area"]/*')
    
    articleDictionary = dict()
    myKey = ""
    myValue_total = ""

    Chương trình trên đã đặt tất cả các phần tử web liên quan đến nội dung bài báo vào một danh sách gọi là “articleObjects”. Vì tất cả các phần tử web này song song với nhau chứ không phải trong một cấu trúc lồng nhau, nên chúng ta chỉ cần sử dụng một cấp độ của vòng lặp for để lặp từng phần tử web trong danh sách và đưa nội dung của nó vào đúng vị trí trong từ điển mà chúng ta đã tạo như . Nếu tên thẻ của một thành phần web trong danh sách bắt đầu bằng “h”, thì nội dung của nó phải là tiêu đề tiểu mục. Chúng tôi cạo nội dung của nó thành một biến chuỗi “myKey”. Nếu tên thẻ của một phần tử web trong danh sách bắt đầu bằng “p” hoặc “ul”, thì nội dung của nó phải là một đoạn văn hoặc một tập hợp các dấu đầu dòng bên dưới tiêu đề tiểu mục đó. Chúng tôi cạo nội dung của nó và nối nó vào một biến chuỗi “myValue_total”. Khi chúng ta gặp tiêu đề tiểu mục tiếp theo, chương trình phải nối thêm tất cả các đoạn văn và dấu đầu dòng bên dưới tiêu đề tiểu mục hiện tại và lưu chúng vào một chuỗi “myValue_total”. Tại thời điểm này, chúng tôi nhập cặp khóa-giá trị - tiêu đề tiểu mục hiện tại làm khóa và tất cả các đoạn văn và dấu đầu dòng bên dưới tiêu đề tiểu mục này làm giá trị của nó - vào từ điển. Sau đó, chúng tôi thay thế khóa là tiêu đề tiểu mục hiện tại bằng tiêu đề tiểu mục tiếp theo và lặp lại các bước trên

    for i in range(len(articleObjects)):
        tagName = articleObjects[i].tag_name
        if tagName.startswith("h"):
            if myKey:
                articleDictionary[myKey] = myValue_total
                myKey = ""
                myValue_total = ""
            myKey = articleObjects[i].get_attribute("innerText")
        if tagName.startswith("p"):
            myValue = articleObjects[i].get_attribute("innerText")
            myValue_total = myValue_total + myValue
        if tagName.startswith("ul"):
            myBullets = articleObjects[i].find_elements_by_tag_name('li')
            for j in range(len(myBullets)):
                myBullet = myBullets[j].get_attribute("innerText")
                myValue_total = myValue_total + myBullet
    driver.close()

    Sau khi hoàn thành vòng lặp, chúng tôi đã loại bỏ tất cả các phần phụ một cách riêng biệt và lưu trữ chúng vào một từ điển. Cuối cùng, chúng ta chỉ cần lặp từng cặp khóa-giá trị trên từ điển này và nối nội dung của chúng lại với nhau khi chúng ta lặp qua từ điển

    Dưới đây là một ví dụ về bảng web động trong Selenium for Sales. Dựa trên các bộ lọc ngày đầu vào, số lượng hàng sẽ bị thay đổi. Vì vậy, nó là năng động trong tự nhiên

    Cách lấy dữ liệu từ bảng html trong selen python

    Xử lý bảng tĩnh thì dễ, nhưng xử lý bảng động trong Selenium hơi khó vì hàng và cột không cố định

    Mục lục

    Sử dụng X-Path để định vị các thành phần bảng web

    Trước khi chúng tôi xác định vị trí phần tử web, trước tiên hãy hiểu-

    Phần tử web là gì?

    Các phần tử web không là gì ngoài các phần tử HTML như hộp văn bản, nút radio thả xuống, nút gửi, v.v. Các phần tử HTML này được viết bằng thẻ bắt đầu và kết thúc bằng thẻ kết thúc

    Ví dụ,

    Tài liệu HTML đầu tiên của tôi

    Các bước để lấy đường dẫn X của phần tử web mà chúng tôi muốn xác định vị trí

    Bước 1) Trong Chrome, Truy cập http. //thử nghiệm. gu99. com/test/web-table-element. php

    Cách lấy dữ liệu từ bảng html trong selen python

    Bước 2) Nhấp chuột phải vào phần tử web có đường dẫn x sẽ được tìm nạp. Trong trường hợp của chúng tôi, nhấp chuột phải vào “Công ty” Chọn tùy chọn Kiểm tra. Màn hình sau sẽ được hiển thị -

    Cách lấy dữ liệu từ bảng html trong selen python

    Bước 3) Nhấp chuột phải vào webelement được tô sáng > Chọn Sao chép -> Tùy chọn Sao chép xpath

    Cách lấy dữ liệu từ bảng html trong selen python

    Bước 4) Sử dụng Xpath “//*[@id=”left container”]/table/thead/tr/th [1]” đã sao chép trong Selenium WebDriver để định vị phần tử

    Ví dụ. Tìm nạp số lượng hàng và cột từ Dynamic WebTable

    Trong khi xử lý bảng web động trong Selenium, chúng tôi không thể dự đoán số lượng hàng và cột của nó

    Sử dụng trình điều khiển web Selenium, chúng ta có thể tìm thấy

    • Số hàng và cột của bảng web trong Selenium
    • Dữ liệu của hàng X hoặc cột Y

    Dưới đây là chương trình tìm nạp tổng số hàng và cột để xử lý bảng web trong Selenium

    Cách lấy dữ liệu từ bảng html trong selen python

    import java.text.ParseException;
    import java.util.List;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    public class Noofrowsandcols {
        
    public static void main(String[] args) throws ParseException {
        	WebDriver wd;
    	  System.setProperty("webdriver.chrome.driver","G://chromedriver.exe");
    	  wd= new ChromeDriver();
            wd.get("http://demo.guru99.com/test/web-table-element.php");         
            //No.of Columns
            List <webelement> col = wd.findElements(By.xpath(".//*[@id=\"leftcontainer\"]/table/thead/tr/th"));
            System.out.println("No of cols are : " +col.size()); 
            //No.of rows 
            List <webelement> rows = wd.findElements(By.xpath(".//*[@id='leftcontainer']/table/tbody/tr/td[1]")); 
            System.out.println("No of rows are : " + rows.size());
            wd.close();
        }
    }
    

    Giải thích mã

    • Ở đây, trước tiên chúng ta đã khai báo đối tượng Webdriver “wd” và khởi tạo nó thành trình điều khiển chrome
    • We use List to total number of columns in “col”.
    • lệnh findElements trả về danh sách TẤT CẢ các phần tử khớp với bộ định vị đã chỉ định
    • sử dụng findElements và X-path //*[@id=\”leftcontainer\”]/table/thead/tr/th chúng tôi nhận được tất cả các cột
    • Tương tự, chúng tôi lặp lại quy trình cho các hàng

    đầu ra

    Cách lấy dữ liệu từ bảng html trong selen python

    Ví dụ. Tìm nạp giá trị ô của một hàng và cột cụ thể của Bảng động

    Giả sử chúng ta cần hàng thứ 3 của bảng và dữ liệu của ô thứ hai. Xem bảng bên dưới-

    Cách lấy dữ liệu từ bảng html trong selen python

    Trong bảng trên, dữ liệu được cập nhật thường xuyên sau một khoảng thời gian. Dữ liệu bạn thử truy xuất sẽ khác với ảnh chụp màn hình ở trên. Tuy nhiên, mã vẫn giữ nguyên. Đây là chương trình mẫu để lấy dữ liệu của hàng thứ 3 và cột thứ 2

    Làm cách nào để đọc bảng html trong Selenium Python?

    từ Selenium nhập webdriver. # nhập lớp Khóa
    trình điều khiển = webdriver. Chrome (executable_path="C. \\ chromedriver. exe") # lấy phương thức để chạy URL
    tài xế. get (u) # để xác định một ô, hàng 3 và cột 2
    c = tài xế. find_element_by_xpath ("//*[@class= 'spTable']/tbody/tr[3]/td[2]").
    in (c. chữ)

    Làm cách nào để trích xuất dữ liệu từ bảng html bằng 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ụ dành cho nhà phát triển của mình để xem HTML trông như thế nào và xác minh xem đó có thực sự là một bảng chứ không phải một phần tử nào khác không. Bạn mở công cụ dành cho nhà phát triển bằng phím F12, xem tab “Thành phần” và đánh dấu thành phần bạn quan tâm .

    Làm cách nào để cạo bảng html trong Selenium Python?

    Bước 1. Tạo một phiên và tải trang. Bước đầu tiên chúng ta cần làm là tạo một phiên trình điều khiển web, phiên Chrome mới chẳng hạn. .
    Bước 2. Phân tích cú pháp mã HTML và lấy bảng với Beautiful Soup. .
    Bước 3. Đọc bảng với Pandas read_html()

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

    Chúng ta có thể lấy tất cả các giá trị bên trong một bảng trong Selenium với sự trợ giúp của phương thức find_elements . Các hàng của bảng được biểu thị bằng thẻ