Очистка данных из таблицы HTML с использованием xpath и LXML или селена - PullRequest
1 голос
/ 14 апреля 2019

Мне нужно извлечь данные из таблицы HTML с этого сайта: https://1x2.lucksport.com/result_en.shtml?dt=2019-04-12&cid=156

Я использую Python, селен и lxml с xpath

Я хочу извлечь все шансы на совпадение Проблема в том, чтокаждое совпадение находится во 2 строке два: tr class = "dtd2", затем идут два: tr class = "dtd1"

Мне нужен xpath, позволяющий извлечь первую строку и следующую строку

driver.get(u)
t = html.fromstring(driver.page_source)
for i in t.xpath('//*[@id="odds_tb"]/table/tbody/tr[@class="dtd2"]/td[1]/text()'):

Ответы [ 3 ]

1 голос
/ 14 апреля 2019

Более подробный метод

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as bs
import pandas as pd
import copy

d = webdriver.Chrome()
d.get('https://1x2.lucksport.com/result_en.shtml?dt=2019-04-12&cid=156')
WebDriverWait(d, 20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#odds_tb tr[class]")))
soup = bs(d.page_source, 'lxml')
rows = soup.select('#odds_tb tr[class]')
results = []
i = 1 
headers = ['Competition', 'Date', 'Match' ,'OddsType', 'Home Win', 'Draw', 'Away Win', 'Result']

for row in rows[1:]:    
    cols = [td.text for td in row.select('td')]

    if (i % 2 == 1):
        record = {'Competition' : cols[0],
                  'Date' : cols[1],
                  'Match' : ' v '.join([cols[2], cols[6]]),
                  'OddsType' : 'average early odds',
                  'Home Win' : cols[3], 
                  'Draw' : cols[4], 
                  'Away Win' : cols[5],
                  'Result' : cols[7]}
    else:
        record['OddsType'] = 'average live odds'
        record['Home Win'] = cols[0] 
        record['Draw'] = cols[1] 
        record['Away Win'] = cols[2]
    results.append(copy.deepcopy(record))
    i+=1

df = pd.DataFrame(results, columns = headers)
df.to_csv(r'C:\Users\User\Desktop\data.csv', sep=',', encoding='utf-8-sig',index = False )
d.quit()
0 голосов
/ 14 апреля 2019

Похоже, вы хотите перебрать нечетные trs, а затем включить «следующий» tr. В CSS это выглядит так:

.dtd1:nth-child(odd),.dtd2:nth-child(odd)

Вы также можете получить коэффициент с xpath, просто добавьте:

[position() mod 2 = 1]
0 голосов
/ 14 апреля 2019

Вы можете использовать как selenium, так и pandas, чтобы получить информацию о таблице.

from selenium import webdriver
import time
import pandas as pd

driver = webdriver.Chrome()
driver.get("https://1x2.lucksport.com/result_en.shtml?dt=2019-04-12&cid=156")
time.sleep(3)
htmlcontent=driver.page_source
tables=pd.read_html(htmlcontent)
print(tables[14])
...