【问题标题】:How can I find the right xpath and loop over table?如何找到正确的 xpath 并循环遍历表?
【发布时间】:2019-12-03 01:14:42
【问题描述】:

我想从https://powerhouse.net/forecast-prijzen-onbalans/ 上的“Elektriciteit NL”表中获取所有值。然而,在无休止地尝试使用 selenium 找到正确的 xpath 之后,我无法刮掉桌子。

我尝试使用“inspect”并从表中复制 xpath 以识别表的长度以便稍后抓取。在此失败后,我尝试使用“包含”,但这也没有成功。后来我用 BeautifullSoup 尝试了一些东西,但是没有任何运气。

#%%
import pandas as pd

from selenium import webdriver
import pandas as pd
#%% powerhouse Elektriciteit NL base & peak

url = "https://powerhouse.net/forecast-prijzen-onbalans/"

#%% open webpagina
driver = webdriver.Chrome(executable_path = path + 'chromedriver.exe')
driver.get(url)

#%%
prices = []


#loop for values in table
for j in range(len(driver.find_elements_by_xpath('//tr[@id="endex_nl_forecast"]/div[3]/table/tbody/tr[1]/td[4]'))):
    base = driver.find_elements_by_xpath('//tr[@id="endex_nl_forecast"]/div[3]/table/tbody/tr[1]/td[4]')[j]


#%%
#trying with BeautifulSoup
from bs4 import BeautifulSoup
import requests 


response = requests.get(url)

soup = BeautifulSoup(response.content, "html.parser")

table  = soup.find('table', id = 'endex_nl_forecast')
rows = soup.find_all('tr')

我想将表格放在数据框中,并了解 xpath 的确切工作原理。我对整个概念有点陌生。

【问题讨论】:

    标签: python selenium web-scraping beautifulsoup python-requests


    【解决方案1】:

    如果您对 xpath 以外的其他方式持开放态度,您可以在不使用 selenium 或 xpath 的情况下执行此操作:

    你可以只使用熊猫

    import pandas as pd
    
    table = pd.read_html('https://powerhouse.net/forecast-prijzen-onbalans/')[4]
    

    如果您想要图标的文本表示,您可以提取 svg 的类名,它从相应的 tds 中描述箭头方向。

    from bs4 import BeautifulSoup as bs
    import requests
    import pandas as pd
    
    r = requests.get('https://powerhouse.net/forecast-prijzen-onbalans/')
    soup = bs(r.content, 'lxml')
    table = soup.select_one('#endex_nl_forecast table')
    rows = []
    headers = [i.text for i in table.select('th')]
    
    for tr in table.select('tr')[1:]:
        rows.append([i.text if i.svg is None else i.svg['class'][2].split('-')[-1] for i in tr.select('td') ])
    
    df = pd.DataFrame(rows, columns = headers)
    print(df)
    

    示例行:

    【讨论】:

    • 第二种解决方案很好。谢谢!
    【解决方案2】:

    您可以使用 Selenium 驱动程序来定位表格及其内容,

    url = 'https://powerhouse.net/forecast-prijzen-onbalans/'
    driver.get(url)
    
    time.sleep(3)
    

    读取表格标题并打印

    tableHeader = driver.find_elements_by_xpath("//*[@id='endex_nl_forecast']//thead//th")
    print(tableHeader)
    for header in tableHeader:
        print(header.text)
    

    查找表中的行数

    rowElements = driver.find_elements_by_xpath("//*[@id='endex_nl_forecast']//tbody/tr")
    print('Total rows in the table:', len(rowElements))
    

    按原样打印每一行

    for row in rowElements:
        print(row.text)
    

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 2019-11-30
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2019-09-10
      相关资源
      最近更新 更多