Python3用Pandas读取Html表

Python3用Pandas读取Html表,python,html,pandas,Python,Html,Pandas,这里需要帮助。计划提取该站点的所有统计数据 我的问题是我无法阅读表格。我不能这样做,也不能在第一页 有人能帮忙吗 import requests import lxml.html as lh import pandas as pd from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, 'html.parser') url='https://lotostats.ro/toate-rezultatele-win-for-life-

这里需要帮助。计划提取该站点的所有统计数据

我的问题是我无法阅读表格。我不能这样做,也不能在第一页

有人能帮忙吗

import requests
import lxml.html as lh
import pandas as pd
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

url='https://lotostats.ro/toate-rezultatele-win-for-life-10-20'
#Create a handle, page, to handle the contents of the website
page = requests.get(url)
#Store the contents of the website under doc
doc = lh.fromstring(page.content)
#Parse data that are stored between <tr>..</tr> of HTML
tr_elements = doc.xpath('//tr')

#Create empty list
col=[]
i=0
#For each row, store each first element (header) and an empty list
for t in tr_elements[0]:
    i+=1
    name=t.text_content()
    print ('%d:"%s"'%(i,name))
    col.append((name,[]))

#Since out first row is the header, data is stored on the second row onwards
for j in range(1,len(tr_elements)):
    #T is our j'th row
    T=tr_elements[j]

    #If row is not of size 10, the //tr data is not from our table 
    # if len(T)!=10:
    #     break

    #i is the index of our column
    i=0

    #Iterate through each element of the row
    for t in T.iterchildren():
        data=t.text_content() 
        #Check if row is empty
        if i>0:
        #Convert any numerical value to integers
            try:
                data=int(data)
            except:
                pass
        #Append the data to the empty list of the i'th column
        col[i][1].append(data)
        #Increment i for the next column
        i+=1

Dict={title:column for (title,column) in col}
df=pd.DataFrame(Dict)
df.head()   
print(df)  
导入请求
将lxml.html作为lh导入
作为pd进口熊猫
从bs4导入BeautifulSoup
soup=BeautifulSoup(html_doc,'html.parser')
url='1〕https://lotostats.ro/toate-rezultatele-win-for-life-10-20'
#创建一个句柄,页面,来处理网站的内容
page=请求.get(url)
#将网站内容存储在doc下
doc=lh.fromstring(第页内容)
#分析存储在..之间的数据。。HTML格式
tr_elements=doc.xpath('//tr')
#创建空列表
col=[]
i=0
#对于每一行,存储每个第一个元素(标题)和一个空列表
对于tr_元素[0]中的t:
i+=1
名称=t.文本内容()
打印(“%d:“%s”%”(i,名称))
col.append((名称,[]))
#因为out第一行是标题,所以数据存储在第二行之后
对于范围内的j(1,len(tr_元素)):
#这是我们的第j排
T=tr_元素[j]
#如果行的大小不是10,则//tr数据不是来自我们的表
#如果len(T)=10:
#中断
#我是我们专栏的索引
i=0
#遍历行的每个元素
对于t.iterchildren()中的t:
数据=t.文本内容()
#检查行是否为空
如果i>0:
#将任何数值转换为整数
尝试:
数据=int(数据)
除:
通过
#将数据附加到第i列的空列表中
列[i][1]。追加(数据)
#下一列的增量i
i+=1
Dict={title:col中(title,column)的列}
df=pd.数据帧(Dict)
df.head()
打印(df)

动态添加数据。您可以在网络选项卡中找到返回json的源代码

import requests


r = requests.get('https://lotostats.ro/all-rez/win_for_life_10_20?draw=1&columns%5B0%5D%5Bdata%5D=0&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=1&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&start=0&length=20&search%5Bvalue%5D=&search%5Bregex%5D=false&_=1564996040879').json()
您可以对其进行解码,并可能(调查)删除时间戳部分(或简单地用随机数替换)

要查看抽奖线路,请执行以下操作:

print(r['data'])
draw
参数似乎与绘图页相关,例如第二页:

https://lotostats.ro/all-rez/win_for_life_10_20?draw=2&columns[0][data]=0&columns[0][name]=&columns[0][searchable]=true&columns[0][orderable]=false&columns[0][search][value]=&columns[0][search][regex]=false&columns[1][data]=1&columns[1][name]=&columns[1][searchable]=true&columns[1][orderable]=false&columns[1][search][value]=&columns[1][search][regex]=false&start=20&length=20&search[value]=&search[regex]=false&_=1564996040880
您可以更改
长度
,以检索更多结果。例如,我可以故意加大它的尺寸以获得所有结果

import requests

r = requests.get('https://lotostats.ro/all-rez/win_for_life_10_20?draw=1&columns[0][data]=0&columns[0][name]=&columns[0][searchable]=true&columns[0][orderable]=false&columns[0][search][value]=&columns[0][search][regex]=false&columns[1][data]=1&columns[1][name]=&columns[1][searchable]=true&columns[1][orderable]=false&columns[1][search][value]=&columns[1][search][regex]=false&start=0&length=100000&search[value]=&search[regex]=false&_=1').json()

print(len(r['data']))
否则,您可以将
length
参数设置为一个设置的数字,执行初始请求,并根据总记录数(
r['recordsFiltered']
)除以每页结果计算页数

import math

total_results = r['recordsFiltered']
results_per_page = 20
num_pages = math.ceil(total_results/results_per_page)

然后执行循环以获得所有结果(记住更改
draw
param)。显然,请求越少越好。

有没有办法告诉我们您是如何识别站点解析的json的?在“网络”选项卡中尝试了很多次检查json,但未能找到它。这对于我们了解检索数据的步骤将是一件很好的事情!谢谢你QHarr!请看和
import math

total_results = r['recordsFiltered']
results_per_page = 20
num_pages = math.ceil(total_results/results_per_page)