Saya mencoba mengikis beberapa data dari situs web berikut: https://ycharts.com/companies/BP/ pe_rasio

Kode HTML halaman web ditampilkan di bawah, terdiri dari dua tabel, saya telah menempelkan kode satu tabel.

Kode python yang saya gunakan adalah ini:

table = driver.find_element_by_xpath("//[@id='dataTableBox']/div[2]/div[1]/div/table/tbody")

tr1 = table.find_element_by_xpath("//tr[1]")

rows = len(table.find_elements_by_tag_name("tr")) - 1

cols = len(table.find_elements_by_xpath("//tr[2]/td"))

Baris mengembalikan 25 yang benar dan kolom mengembalikan 11 yang salah tentu saja sebagaimana mestinya 2. Adakah yang tahu mengapa? dan solusi untuk ini?

Saya baru saja menggores data dari baris dan saya melihat bahwa itu mengembalikan lebih banyak data daripada yang tertulis dalam kode HTLM di bawah ini. Saya akhirnya ingin mengikis semua data dari tabel di semua halaman

    <div id="dataTableBox" class="box boxData" ng-controller="HistoricalDataCtrl">
    
<div class="dateRangeControl" 
<div ng-show="initPhase">
<div class="dataColLeft">
    <div class="padR"><table class="histDataTable">
        <tbody><tr>
            <th scope="col" class="col1 colHeadLrg">
            <th scope="col" class="col2 colHeadLrg">&nbsp;</th>
        </tr>
        
        <tr>
            <td class="col1">March 30, 2020</td>
            <td class="col2">
                
                    20.13
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 27, 2020</td>
            <td class="col2">
                
                    18.81
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 26, 2020</td>
            <td class="col2">
                
                    20.56
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 25, 2020</td>
            <td class="col2">
                
                    20.45
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 24, 2020</td>
            <td class="col2">
                
                    18.62
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 23, 2020</td>
            <td class="col2">
                
                    15.31
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 20, 2020</td>
            <td class="col2">
                
                    14.64
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 19, 2020</td>
            <td class="col2">
                
                    14.31
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 18, 2020</td>
            <td class="col2">
                
                    13.56
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 17, 2020</td>
            <td class="col2">
                
                    15.86
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 16, 2020</td>
            <td class="col2">
                
                    15.86
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 13, 2020</td>
            <td class="col2">
                
                    18.66
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 12, 2020</td>
            <td class="col2">
                
                    18.16
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 11, 2020</td>
            <td class="col2">
                
                    20.76
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 10, 2020</td>
            <td class="col2">
                
                    22.55
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 9, 2020</td>
            <td class="col2">
                
                    21.28
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 6, 2020</td>
            <td class="col2">
                
                    26.30
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 5, 2020</td>
            <td class="col2">
                
                    27.44
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 4, 2020</td>
            <td class="col2">
                
                    27.90
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 3, 2020</td>
            <td class="col2">
                
                    26.87
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">March 2, 2020</td>
            <td class="col2">
                
                    27.13
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">Feb. 28, 2020</td>
            <td class="col2">
                
                    26.34
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">Feb. 27, 2020</td>
            <td class="col2">
                
                    26.54
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">Feb. 26, 2020</td>
            <td class="col2">
                
                    27.51
                
            </td>
        </tr>
        
        <tr>
            <td class="col1">Feb. 25, 2020</td>
            <td class="col2">
                
                    27.72
                
            </td>
        </tr>
        
    </tbody></table>
-1
RasM10 12 Mei 2021, 20:54

3 jawaban

Jawaban Terbaik

Xpaths relatif Anda, saya pikir, mengirim Anda kembali ke root. Untuk tetap di tempat yang sama, Anda hanya perlu . di depan mereka

table = driver.find_element_by_xpath("//[@id='dataTableBox']/div[2]/div[1]/div/table/tbody")

tr1 = table.find_element_by_xpath(".//tr[1]")

rows = len(table.find_elements_by_tag_name("tr")) - 1

cols = len(table.find_elements_by_xpath(".//tr[2]/td"))
0
C. Peck 12 Mei 2021, 18:14

Masalah Anda adalah ketika Anda mencoba memasukkan elemen ke dalam elemen, Anda kehilangan . di xpath elemen turunan.
Jadi pertama-tama table kiri dapat ditemukan hanya dengan

table = driver.find_element_by_xpath("//div[@id='dataTableBox']//tbody)[1]")

Sekarang

tr1 = table.find_element_by_xpath(".//tr[1]")

rows = len(table.find_elements_by_tag_name("tr")) - 1

cols = len(table.find_elements_by_xpath("//tr[2]/td"))
0
Prophet 12 Mei 2021, 18:16

Jika bukan persyaratan untuk menggunakan Selenium, Anda dapat menggunakan modul permintaan untuk mengikis konten yang sama dari halaman itu karena konten tabular bersifat statis. Adapun jumlah kolom yang salah terkait, xpath relatif yang Anda tentukan salah. Namun, berikut ini akan memberi Anda jumlah yang tepat:

import requests
from lxml.html import fromstring

link = 'https://ycharts.com/companies/BP/pe_ratio'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    res = s.get(link)
    root = fromstring(res.text)
    table = root.xpath("//*[@id='dataTableBox']//table[@class='histDataTable']")[0]
    tr = len(table.xpath(".//tr[./td]"))
    td = len(table.xpath(".//tr[./td][1]/td"))
    print(tr,td)

Keluaran:

25 2
1
SIM 12 Mei 2021, 18:28