Python写静态HTML

'__jdc':'122270672',

因为近期工作需要,常常要将测试结果/数据统计、汇总和展示,因此会有写静态HTML的需求,本文记录下python写静态HTML的小技巧

python读取html文件 python获取html数据python读取html文件 python获取html数据


python读取html文件 python获取html数据


2='&pageSize=10&callback=fetchJSON_comment98vv41127'

回到HTMLTestRunner报告插件,阅读源码发现,作者只用了一个python文件便巧妙的将写HTML、页面绘制和数据嵌入搞定了。进一步分析可以看到,作者先是在Template基类中定义了测试报告的HTML结构模板和各个模块/表格模板,然后再以格式化输入的形式给每一个模板中填充目标数据,再将填充好的模板以格式化输入的形式填充到HTML结构模板中,再将所有内容写成一个HTML文件即可。

可以看到,这样的设计其实优点在于非常小巧和轻量,缺点在于可维护和可移植性,数据量小还尚可,不太适合大量数据的统计和绘制。

这种设计的关键在于建模板,然后 按需 填充数据,再写HTML,通常我的做法是:

如何用python获取京东的评论数据

这里建议将抓取完的数据存储在本地,后续工作可以直接从本地打开文件进行清洗和分析工作。避免每次都要重新抓取数据。这里我们将数据保存在桌面的page.txt文件中。

京东商品评论信息是由JS动态加载的,所以直接抓取商品详情页的URL并不能获得商品评论的信息。因此我们需要先找到存放商品评论信息的文件。这里我们使用Chrome浏览器里的开发者工具进行查找。

}在查看头文件信息的旁边还有一个Cookies标签,点击进去就是本次访问的Cookies信息。这里的Cookies信息与前面头文件中的Cookie信息一致,不过这里更加清晰。把Request Cookies信息到代码中即可,这里我们将Request Cookies信息保存在Cookie中。

具体方法是在商品详情页点击鼠标右键,选择检查,在弹出的开发者工具界面中选择Network,设置为禁用缓存(Disable cache)和只查看JS文件。然后刷新页面。页面加载完成后向下滚动鼠标找到商品评价部分,等商品评价信息显示出来后,在下面Network界面的左侧筛选框中输入productPageComments,这时下面的加载记录中只有一条信息,这里包含的就是商品详情页的商品评论信息。点击这条信息,在右侧的Preview界面中可以看到其中包含了当前页面中的评论信息。(抓取价格信息输入prs)。

这条信息,并把URL地址放在浏览器中打开,里面包含了当前页的商品评论信息。这就是我们要抓取的URL地址。

仔细观察这条URL地址可以发现,其中productId=10001234327是当前商品的商品ID。与商品详情页URL中的ID一致。而page=0是页码。如果我们要获取这个商品的所有评论,只需要更改page后面的数字即可。

在获得了商品评论的真实地址以及URL地址的规律后,我们开始使用python抓取这件商品的700+条评论信息。并对这些信息进行处理和分析。

开始前的准备工作

在开始抓取之前先要导入各种库文件,这里我们分别介绍下需要导入的每个库文件的名称以及在数据抓取和分析中的作用。requests用于进行页面抓取,time用于设置抓取过程中的Sleep时间,random用于生产随机数,这里的作用是将抓取页面的顺序打乱,re用于在抓取后的页面代码中提取需要的信息,numpy用于常规的指标计算,pandas用于进行数据汇总和分析,matplotlib用于绘制各站图表,jieba用于对评论内容进行分词和提取。

#导入requests库(请求和页面抓取)

import requests

#导入time库(设置抓取Sleep时间)

import time

#导入random库(生成乱序随机数)

import random

#导入正则库(从页面代码中提取信息)

import re

#导入数值计算库(常规计算)

import numpy as np

#导入科学计算库(拼表及各种分析汇总)

import pandas as pd

#导入绘制图表库(数据可视化)

import matplotlib.pyplot as plt

#导入结巴分词库(分词)

import jieba as jb

import jieba.yse

将爬虫伪装成浏览器

导入完库文件后,还不能直接进行抓取,因为这样很容易被封。我们还需要对爬虫进行伪装,是爬虫看起来更像是来自浏览器的访问。这里主要的两个工作是设置请求中的头文件信息以及设置Cookie的内容。

头文件信息很容易找到,在Chrome的开发者工具中选择Network,刷新页面后选择Headers就可以看到本次访问的头文件信息,里面包含了一些浏览器的技术参数和引荐来源信息。将这些信息直接添加到代码中就可以,这里我们将头部信息保存在headers中。

#设置请求中头文件的信息#查看整理完的数据表

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',

'Accept':'text/html;q=0.9,/;q=0.8',

'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,;q=0.3',

'Connection':'close',

'Referer':''

#设置Cookie的内容

cookie={'TrackID':'1_VWwvLYiy1FUr7wSr6HHmHhadG8d1-Qv-TVaw8JwcFG4EksqyLyx1SO7O06_Y_XUCyQMksp3RVb2ezA',

'__jda':'122270672.1507607632.1423495705.1479785414.1479794553.92',

'__jdb':'122270672.1.1507607632|92.1479794553',

'__jdu':'1507607632',

'__j':'122270672|direct|-|none|-|1478747001',

'areaId':'1',

'cn':'0',

'ipLoc-djd':'1-72-2799-0',

'ipLocation':'%u5317%u4EAC',

'mx':'0_X',

'user-key':'216123d5-4ed3-47b0-9289-12345',

'xtest':'4657.553.d9798cdf31c02d86b8b81cc119d94836.b7a782741f667201b54880c925faec4b'}

抓取商品评论信息

设置完请求的头文件和Cookie信息后,我们开始抓取京东商品评论的信息。前面分析URL的时候说过,URL中包含两个重要的信息,一个是商品ID,另一个是页码。这里我们只抓取一个商品的评论信息,因此商品ID不需要更改。但这个商品的评论有700+条,也就是有近80页需要抓取,因此页码不是一个固定值,需要在0-80之间变化。这里我们将URL分成两部分,通过随机生成页码然后拼接URL的方式进行抓取。

#设置URL的部分

1=''

#设置URL的第二部分

#乱序输出0-80的随机数

ran_num=random.sample(range(80), 80)

为了使抓取过程看起来更加随机,我们没有从第1页一直抓取到第80页。而是使用random生成0-80的随机数,也就是要抓取的页码编号。然后再将页码编号与两部分URL进行拼接。这里我们只知道商品有700+的评论,但并不知道具体数字,所以抓取范围定位从0-80页。

下面是具体的抓取过程,使用for循环每次从0-80的随机数中找一个生成页码编号,与两部分的URL进行拼接。生成要抓取的URL地址并与前面设置好的头文件信息和Cookie信息一起发送请求获取页面信息。将获取到的页面信息进行汇总。每次请求间休息5秒针,避免过于频繁的请求导致返回空值。

#拼接URL并乱序循环抓取页面

for i in ran_num:

a = ran_num[0]

if i == a:

i=str(i)

=(1+i+2)

r=requests.get(=,headers=headers,cookies=cookie)

html=r.content

else:

i=str(i)

=(1+i+2)

r=requests.get(=,headers=headers,cookies=cookie)

html2=r.content

html = html + html2

time.sleep(5)

print("当前抓取页面:",,"状态:",r)

在抓取的过程中输入每一步抓取的页面URL以及状态。通过下面的截图可以看到,在page参数后面的页码是随机生成的并不连续。

抓取完80个页面后,我们还需要对页面进行编码。完成编码后就可以看到其中所包含的中文评论信息了。后面大部分苦逼的工作就是要对这些评论信息进行不断提取和反复的清洗。

#对抓取的页面进行编码

html=str(html, encoding = "GBK")

#将编码后的页面输出为txt文本存储

file = open("c:Users Desktoppage.txt", "w")

file.write(html)

file.close()

读取文件也比较简单,直接open加read函数就可以完成了。

#读取存储的txt文本文件

html = open('c:Users Desktoppage.txt', 'r').read()

提取信息并进行数据清洗

京东的商品评论中包含了很多有用的信息,我们需要将这些信息从页面代码中提取出来,整理成数据表以便进行后续的分析工作。这里应该就是整个过程中最苦逼的数据提取和清洗工作了。我们使用正则对每个字段进行提取。对于特殊的字段在通过替换等方式进行提取和清洗。

下面是提取的个字段user,也就是用户发布评论时所使用的设备类型,这类的字段提取还比较简单,一行代码搞定。查看一下提取出来的字段还比较干净。使用同样的方法我们分别提取了以下这些字段的内容。

#使用正则提取user字段信息

user=re.findall(r',"usefulVoteCount".?,"userShow":(.?),',html)

#使用正则提取userLl字段信息

userLl=re.findall(r'"referenceImage".?,"userLlName":(.?),',html)

#使用正则提取productColor字段信息

productColor=re.findall(r'"creationTime".?,"productColor":(.?),',html)

recommend=re.findall(r'"creationTime".?,"recommend":(.?),',html)

#使用正则提取nickname字段信息

nickname=re.findall(r'"creationTime".?,"nickname":(.?),',html)

#使用正则提取userProvince字段信息

userProvince=re.findall(r'"referenceImage".?,"userProvince":(.?),',html)

usefulVoteCount=re.findall(r'"referenceImage".?,"usefulVoteCount":(.?),',html)

#使用正则提取days字段信息

days=re.findall(r'"usefulVoteCount".?,"days":(.?)}',html)

#使用正则提取score字段信息

score=re.findall(r'"referenceImage".?,"score":(.?),',html)

还有一些字段比较负责,无法通过正则一次提取出来,比如isMobile字段,有些值的后面还有大括号。这就需要进一步的提取和清洗工作。

#使用正则提取isMobile字段信息

isMobile=re.findall(r'"usefulVoteCount".?,"isMobile":(.?),',html)

使用for循环配合替换功能将字段中所有的}替换为空。替换完成后字段看起来干净多了。

#替换掉的}

mobile=[]

for m in isMobile:

n=m.replace('}','')

mobile.append(n)

productSize字段中包含了胸围和杯罩两类信息,为了获得的杯罩信息需要进行二次提取,将杯罩信息单独保存出来。

#使用正则提取productSize字段信息

productSize=re.findall(r'"creationTime".?,"productSize":(.?),',html)

#提取杯罩信息

cup=[]

for s in productSize:

s1=s[3]

cup.append(s1)

创建评论的日期信息仅依靠正则提取出来的信息还是比较乱,无法直接使用。因此也需要进行二次提取。下面是使用正则提取出的结果。

#使用正则提取时间字段信息

creationTime1=re.findall(r'"creationTime":(.?),"referenceName',html)

日期和时间信息处于前20个字符,在二次提取中根据这个规律直接提起每个条目的前20个字符即可。将日期和时间单独保存为creationTime。

#提取日期和时间

creationTime=[]

for d in creationTime1:

date=d[1:20]

creationTime.append(date)

在上一步日期和时间的基础上,我们再进一步提取出单独的小时信息,方法与前面类似,提取日期时间中的第11和12个字符,就是小时的信息。提取完保存在hour字段以便后续的分析和汇总工作。

#提取小时信息

for h in creationTime:

date=h[10:13]

hour.append(date)

要提取的是评论内容信息,页面代码中包含的评论信息是重复的,因此在使用正则提取完后还需要对评论信息进行去重。

#使用正则提取评论信息

使用if进行判断,排除掉所有包含的评论信息,已达到评论去重的目的。

content_1=[]

for i in content:

if not "img" in i:

content_1.append(i)

完成所有字段信息的提取和清洗后,将这些字段组合在一起生成京东商品评论数据汇总表。下面是创建数据表的代码。数据表生成后还不能马上使用,需要对字段进行格式设置,例如时间和日期字段和一些包含数值的字段。具体的字段和格式设置依据后续的分析过程和目的。这里我们将creationTime设置为时间格式,并设置为数据表的索引列。将days字段设置为数值格式。

#将前面提取的各字段信息汇总为table数据表,以便后面分析

table=pd.DataFrame({'creationTime':creationTime,'hour':hour,'nickname':nickname,'productColor':productColor,'productSize':productSize,'cup':cup,'recommend':recommend,'mobile':mobile,'user':user,'userLl':userLl,'userProvince':userProvince,'usefulVoteCount':usefulVoteCount,'content_1':content_1,'days':days,'score':score})

#将creationTime字段更改为时间格式

table['creationTime']=pd.to_datetime(table['creationTime'])

#设置creationTime字段为索引列

table = table.set_index('creationTime')

#设置days字段为数值格式

table['days']=table['days'].astype(np.int64)

table.head()

这里建议再次保存清洗和预处理完的数据表。我们这里将数据表保存为csv格式。到了这一步可以选择在Excel中完成后续的数据分析和可视化过程,也可以继续在python中完成。我们这里选择继续在python中完成后续的数据分析和可视化工作。

#保存table数据表

table.to_csv('jd_table.csv')

数据分析及可视化

分月评论数据变化趋势

首先查看京东商品评论的时间变化趋势情况,大部分用户在购买商品后会在10天以内进行评论,因此我们可以近似的认为在一个月的时间维度中评论时间的变化趋势代表了用户购买商品的变化趋势。

能不能做一个html页面,然后按钮的功能用python实现

tr1 = table1 << tr(id="header")

你好 可以的,不过你需要会jascript和AJAX,AJAX可以在不刷新网页的情况下把数据传给后端,你可以通过HTML来定义按钮,然后通过jascript定义按钮,然后通过AJAX把数据传给后#使用正则提取recommend字段信息端,后端用Python处理后在把数据传给前端,如果你对jascript还不是太熟练的话可以使用jQuery这个jascript库,jQuery简化了很多原生jascript复杂的部分。不过如果你需要的功能能在前端实现的话就尽量不要让后端来作,除非是必须要提交数据给后端处理,因为每次提交数据给后端都要耗费一定的时间,如果遇上网络不好的情况体验会比较。希望我的回答能够帮助到你,如果还有什么疑问可以继续追问。

python-flask 后台传递用户信息显示在html中

灵感时来源于unittest测试框架最常用的报告插件: HTMLTestRunner ,该插件本身基于python2且已经更新了,好在 @虫师 一直在维护和更新这个插件,使得它能继续被大家所使用,了解详情请移步: SeldomQA/HTMLTestRunner

用法:

1.导入render_template函数

2.当你创建完成flask项目后,会自动生成static文件夹用来放css,js文件,templates文件夹放htm#导入结巴分词(提取)l文件。在templates文件夹下新建index.html文件

3.在app.py中渲染html,templates文件夹是自动生成的,当使用render_template渲染html时,它会自动去templates文件夹下找,所以这里不用谢文件夹名字,直接写html的名字就可以。

效果图

在网页中用户登录后,显示用名字,就是后台向前端界面传递用户的信息,前端接收到后显示出来。

用法:在渲染模板时将参数写在后面def wordsToHtml(dir):

在html文件中获取参数,读取值使用{{参数名}}

当传递参数较多时,将它们放在字典中,然后使用字典名进行传递

读取方法还相同

补充:如果字典中有对象,要在html中获取对象的属性值,{{对象名.属性}},如果字典中还有字典,同样获取值使用{{字典名.属性}}

怎么用python将word转成html

#使用正则提取usefulVoteCount字段信息

#coding=utf-8

content=re.findall(r'"guid".?,"content":(.?),',html)

#文件名:

#BatchConverWords2Html.py

#说明:

#调用方式:进入源程序目录,命令:python BatchConverWords2Html.py RootDir

from win32com import client as wc

word = wc.Dispatch('Word.Application')

for path, subdirs, files in os.walk(dir):

for wordFile in files:

#print "word:" + wordFullName

doc = word.Documents.Open(wordFullName)

wordFile2 = unicode(wordFile, "gbk")

dotIndex = wordFile2.rfind(".")

if(dotIndex == -1):

print "ERROR: 未取得后缀名!"

fileSuffix = wordFile2[(dotIndex + 1) : ]

if(fileSuffix == "doc" or fileSuffix == "docx"):

fileName = wordFile2[ : dotIndex]

htmlName = fileName + ".html"

htmlFullName = os.path.join(unicode(path, "gbk"), htmlName)

#htmlFullName = unicode(path, "gbk") + "" + htmlName

print "generate html:" + htmlFullName

doc.Close()

word.Quit()

print ""

print "Finished!"

if __nawordsToHtml(sys.argv[1])运行结果就是在rootdir目录下的所有word文档转为简洁版的html网页文件,生成的文件存在原word同目录下,生成 xxx.files 文件夹。me__ == '__main__':

import sys

if len(sys.argv) != 2:

print "Usage: python funcName.py rootdir"

sys.exit(100)

怎样用Python写一个Html的简单网页

'rkv':'V0800',

#对提取的评论信息进行去重个 Release 的时候清理 Migrations 合并成一个;

可获取码列表:

其中所有liscode是从一个txt文档上提取的,当用户点击获取一个的时候,该项即被删除。

如何用python实现呢?

做一个py脚本或exe给用户实现的话大概像下面这样:

Python code

基于文本文档(Markdown) 设想好需要的基本需要的表、字段、类型;

使用 Rails Migration 随着功能的开发逐步创建表;

随着细节功能的开发、需求,逐步增加字段,删除字段,或者调整字段类型;

随着后期的改动,逐步增加、修改、删除字段或表。

基本上我的所有项目都是这么搞的,这和项目是否复杂无关。

所以我前面为什么说思路需要转变。

用python生成在html中显示的表格

3.pycharm软件Terminal中输入allure

.doc.SeAs(htmlFullName, 10).

conn = sqlite3.connect(database='thedbfile')

curr = conn.cursor()

cur使用for循环将productSize中的第三个字符杯罩信息提取出来,并保持在cup字段中。r.execute("select from thetable")

for field in curr.description:

tr1 << th(field[0])

for row in curr:

tr2 = table1 << tr()

for in row:

tr2 << td()

curr.close()

conn.close()

...以上代码基于1L"就是累w_w"的方案进行完善

python怎样做html的表格

hour=[]

基于文本文档(Markdown) 设想好需要的基本需要的表、字段、类型;

#批量将一个文件夹下的所有.doc/.docx文件转为.html文件,需要安装对应的win32模块

使用 Rails Migration 随着功能的开发逐步创建表;

随着细节功能的开发、需求,逐步增加字段,删除字段,或者调整字段类型;

随着后期的改动,逐步增加、修改、删除字段infile = open('codelist.txt','r') codelist = infile.readlines() used_code = codelist[0] #remove用掉的code(删除行) codelist.remove(codelist[0]) infile.close() #重写文件(我不知道是否有能直接删除一行的文件作方法) outfile = open('codelist.txt','w') for code in codelist: outfile.write(code + 'n') outfile.close() print used_code或表。

基本上我的所有项目都是这么搞的,这和项目是否复杂无关。

所以我前面为什么说思路需要转变。

Python+selenium自动化,Allure包不生成index.html文件,解决方法

wordFullName = os.path.join(path, wordFile)

查看ui自动化生成的html报告。pytest+allure只生成了xml报告--json格式的数据,没有生成html的index报告。

import os

场景:

排查:

1.cmd输入allure --version,查看是安装成功

2.pycharm输入pip freeze,查看包是否配置成功

都显示安装、配置成功

怀疑是pycharm软件哪里配置除了问题,排查浪费了N多时间。

最终总算是配置好了~

解决方法: