对象基本上就是一个字典把它转换成一个包含元组的列表,然后用合适的分隔符连接起来就好了12345importrequestsresp=requestsget(url)cookies=respcookiesprint(';'join(['='join(item)for
首先确认你贴出来的这些都是被Python采集的字符串,假设为 s
即:s = """var uA = new Array();
var uD = new HashMap;
uA[0] = new Array();"""
然后你针对你感兴趣的内容来过滤出你要的信息(比如你只对双引号内的内容感兴趣)
参考代码如下:
# -- coding: cp936 --s = """var uA = new Array();
var uD = new HashMap();
uA[0] = new Array();
uA[0][0] = "01";
uA[0][1] = "\xd6\xd0\xc1\xb8\xc1\xc9\xc4\xfe\xc1\xb8\xd3\xcd\xbd\xf8\xb3\xf6\xbf\xda\xb9\xab\xcb\xbe\xb4\xf3\xc1\xac\xb4\xa2\xd4\xcb\xc3\xb3\xd2\xd7\xb9\xab\xcb\xbe";
uDput("a-F", 0);
uA[1] = new Array();
uA[1][0] = "02";
uA[1][1] = "\xb4\xf3\xc1\xac\xba\xcf\xc8\xda\xb2\xd6\xb4\xa2\xd3\xd0\xcf\xde\xb9\xab\xcb\xbe";
"""
# 逐行分析,这里可以看出每行结尾都有';' 可以用来做划分行的字符
for line in ssplit(";"):
# 如果这一行的末尾是'"' 说明这是我们要的内容
if '"' == line[-1]:
# 双引号的起始位置
i = linefind('"')
# 获取双引号间的内容 这时会得到类似 "\xd6\xd0\xc1\xb8"这样的东西
text = line[i:]
# 我们需要把马上的东西解码一下,简单的用 eval 就行了
text = eval(text)
# 打印出你要的结果
print(text)
输出:
>>>
01
中粮辽宁粮油进出口公司大连储运贸易公司
02
大连合融仓储有限公司
希望对你有所帮助~~
方法1:BS版
简单写了个,只是爬链接的,加上标题老报错,暂时没看出来原因,先给你粘上来吧(方法2无问题)
from
BeautifulSoup
import
BeautifulSoup
import
urllib2
import
re
def
grabHref(url,localfile):
html
=
urllib2urlopen(url)read()
html
=
unicode(html,'gb2312','ignore')encode('utf-8','ignore')
content
=
BeautifulSoup(html)findAll('a')
myfile
=
open(localfile,'w')
pat
=
recompile(r'href="([^"])"')
pat2
=
recompile(r'/tools/')
for
item
in
content:
h
=
patsearch(str(item))
href
=
hgroup(1)
if
pat2search(href):
#
s
=
BeautifulSoup(item)
#
myfilewrite(sastring)
#
myfilewrite('\r\n')
myfilewrite(href)
myfilewrite('\r\n')
#
sasting
href
myfileclose()
def
main():
url
=
">
在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxmlhtml的xpath对html进行分析,获取抓取信息。
首先,我们需要安装一个支持xpath的python库。目前在libxml2的网站上被推荐的python binding是lxml,也有beautifulsoup,不嫌麻烦的话还可以自己用正则表达式去构建,本文以lxml为例讲解。
假设有如下的HTML文档:
1 <html> 2 <body> 3 <form> 4 <div id='leftmenu'> 5 <h3>text</h3> 6 <ul id=’china’><!-- first location --> 7 <li></li> 8 <li></li> 9 10 </ul>11 <ul id=’england’><!-- second location-->12 <li></li>13 <li></li>14 15 </ul>16 </div>17 </form>18 </body>19 </html>
直接使用lxml处理:
1 import codecs2 from lxml import etree3 f=codecsopen("ceshihtml","r","utf-8")4 content=fread()5 fclose()6 tree=etreeHTML(content)
etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了,是不是有点小激动,现在就尝试下吧。
在使用xpath之前我们先来看看作为对照的jQuery和RE。
在jQuery里要处理这种东西就很简单,特别是假如那个ul节点有id的话(比如是<ul id=’china’>):
$("#china")each(function(){});
具体到此处是:
$("#leftmenu")children("h3:contains('text')")next("ul")each(function(){});
找到id为leftmenu的节点,在其下找到一个内容包含为”text”的h3节点,再取其接下来的一个ul节点。
在python里要是用RE来处理就略麻烦一些:
block_pattern=recompile(u"<h3>档案</h3>()<h3>", reI | reS)
m=block_patternfindall(content)
item_pattern=recompile(u"<li>()</li>", reI | reS)
items=item_patternfindall(m[0])for i in items: print i
那么用xpath要怎么做呢?其实跟jQuery是差不多的:
nodes=treexpath("/descendant::ul[@id='china']")
当然,现在没有id的话也就只能用类似于jQuery的方法了。完整的xpath应该是这样写的(注意,原文件中的TAG有大小写的情况,但是在XPATH里只能用小写):
nodes=treexpath(u"/html/body/form/div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")
更简单的方法就是像jQuery那样直接根据id定位:
nodes=treexpath(u"//div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")
这两种方法返回的结果中,nodes[0]就是那个“text”的h3节点后面紧跟的第一个ul节点,这样就可以列出后面所有的ul节点内容了。
如果ul节点下面还有其他的节点,我们要找到更深节点的内容,如下的循环就是把这些节点的文本内容列出:
nodes=nodes[0]xpath("li/a")for n in nodes: print ntext
对比三种方法应该可以看出xpath和jQuery对于页面的解析都是基于XML的语义进行,而RE则纯粹是基于plain
text。RE对付简单的页面是没有问题,如果页面结构复杂度较高的时候(比如一堆的DIV来回嵌套之类),设计一个恰当的RE
pattern可能会远比写一个xpath要复杂。特别是目前主流的基于CSS的页面设计方式,其中大部分关键节点都会有id――对于使用jQuery的页面来说则更是如此,这时xpath相比RE就有了决定性的优势。
附录:基本XPATH语法介绍,详细请参考XPath的官方文档
XPATH基本上是用一种类似目录树的方法来描述在XML文档中的路径。比如用“/”来作为上下层级间的分隔。第一个“/”表示文档的根节点(注意,不是指文档最外层的tag节点,而是指文档本身)。比如对于一个HTML文件来说,最外层的节点应该是”/html”。
同样的,“”和“”分别被用来表示父节点和本节点。
XPATH返回的不一定就是唯一的节点,而是符合条件的所有节点。比如在HTML文档里使用“/html/head/scrpt”就会把head里的所有script节点都取出来。
为了缩小定位范围,往往还需要增加过滤条件。过滤的方法就是用“[”“]”把过滤条件加上。比如在HTML文档里使用“/html/body/div[@id='main']”,即可取出body里id为main的div节点。
其中@id表示属性id,类似的还可以使用如@name, @value, @href, @src, @class…
而
函数text()的意思则是取得节点包含的文本。比如:<div>hello<p>world</p><
/div>中,用”div[text()='hello']“即可取得这个div,而world则是p的text()。
函数position()的意思是取得节点的位置。比如“li[position()=2]”表示取得第二个li节点,它也可以被省略为“li[2]”。
不过要注意的是数字定位和过滤
条件的顺序。比如“ul/li[5][@name='hello']”表示取ul下第五项li,并且其name必须是hello,否则返回空。而如果用
“ul/li[@name='hello'][5]”的意思就不同,它表示寻找ul下第五个name为”hello“的li节点。
此外,“”可以代替所有的节点名,比如用”/html/body//span”可以取出body下第二级的所有span,而不管它上一级是div还是p或是其它什么东东。
而
“descendant::”前缀可以指代任意多层的中间节点,它也可以被省略成一个“/”。比如在整个HTML文档中查找id为“leftmenu”的
div,可以用“/descendant::div[@id='leftmenu']”,也可以简单地使用“
//div[@id='leftmenu']”。
至于“following-sibling::”前缀就如其名所说,表示同一层的下一个节点。”following-sibling::”就是任意下一个节点,而“following-sibling::ul”就是下一个ul节点。
python中每一个对象或者对象的方法都有可以使用三种方式查看相关的使用方法和帮助文档。
直接调用对象或者方法的 doc 属性,或者使用dir()或者使用help()来查看就可以了。
DataFrame对象:二维表数据结构,由行列数据组成的表格
常用index表示行,columns表示列
'''
语文 数学 英语
0 110 105 99
1 105 88 115
2 109 120 130
'''
# print(dfcolumns) # Index(['语文', '数学', '英语'], dtype='object')
# print(dfindex) # Int64Index([0, 1, 2], dtype='int64')
# 遍历DataFrame数据的每一列
'''
0 110
1 105
2 109
Name: 语文, dtype: int64
0 105
1 88
2 120
Name: 数学, dtype: int64
0 99
1 115
2 130
Name: 英语, dtype: int64
'''
1创建一个DataFrame对象
pandasDataFrame(data,index,columns,dtype,copy)
# data表示数据,可以是ndarray数组,series对象、列表、字典等
# index表示行标签(索引)
# columns表示列标签(索引)
# dtype每一列数据的数据类型
# copy用于复制数据
# 返回值DataFrame
通过二维数组创建成绩表
'''
语文 数学 英语
0 110 105 99
1 105 88 115
2 109 120 130
'''
2通过字典创建DataFrame对象
value值只能是一维数组或单个的简单数据类型
# 数组,则要求所有的数组长度一致
# 单个数据,每行都需要添加相同数据
'''
语文 数学 英语 班级
0 110 105 109 高一7班
1 105 88 120 高一7班
2 99 115 130 高一7班
'''
'''
DataFrame属性
values 查看所有元素的值 dfvalues
dtypes 查看所有元素的类型 dfdtypes
index 查看所有行名、重命名行名 dfindex dfindex=[1,2,3]
columns 查看所有列名、重命名列名 dfcolumns dfcolumns=['语','数']
T 行列数据转换 dfT
head 查看前n条数据,默认5条 dfhead() dfhead(10)
tail 查看后n条数据,默认5条 dftail() dftail(10)
shape 查看行数和列数,[0]表示行,[1]表示列 dfshape[0] dfshape[1]
info 查看索引,数据类型和内存信息 dfinfo
DataFrame函数
describe 查看每列的统计汇总信息,DataFrame类型 dfdescribe()
count 返回每一列中的非空值的个数 dfcount()
sum 返回每一列和和,无法计算返回空值 dfsum()
max 返回每一列的最大值 dfmax()
min 返回每一列的最小值 dfmin()
argmax 返回最大值所在的自动索引位置 dfargmax()
argmin 返回最小值所在的自动索引位置 dfargmin()
idxmax 返回最大值所在的自定义索引位置 dfidxmax()
idxmin 返回最小值所在的自定义索引位置 dfidxmin()
mean 返回每一列的平均值 dfmean()
median 返回每一列的中位数 dfmedian()
var 返回每一列的方差 dfvar()
std 返回每一列的标准差 dfstd()
isnull 检查df中的空值,空值为True,否则为False,返回布尔型数组 dfisnull()
notnull 检查df中的空值,非空值为True,否则为False,返回布尔型数组 dfnotnull()
中位数又称中值,是指按顺序排列的一组数据中居于中间位置的数
方差用于度量单个随机变量的离散程序(不连续程度)
标准差是方差的算术平方根,反映数据集的离散程度
'''
3 导入xls或xlsx文件
# pandasread_excel(io,sheetname=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None,na_values=None,keep_defalut_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,comment=None,skipfooter=0,conver_float=True,mangle_dupe_cols=True,kwds)
'''
io 字符串,xls或xlsx文件路径或类文件对象
sheet_name:None、字符串、整数、字符串列表或整数列表,默认值为0
字符串用于工作表名称;整数为索引,表示工作表位置
字符串列表或整数列表用于请求多个工作表,为None时则获取所有的工作表
sheet_name = 0 第一个Sheet页中的数据作为DataFrame对象
sheet_name = 1 第二个Sheet页中的数据作为DataFrame对象
sheet_name = 'Sheet1' 名为Sheet1的Sheet页中的数据作为DataFrame对象
sheet_name = [0,1,'Sheet3'] 第一个,第二个和名为Sheet3的Sheet页中的数据作为DataFrame对象
header:指定作为列名的行,默认值为0,即取第一行的值为列名。或数据不包含列名,则为header=None
names:默认值为None,要使用的列名列表
index_col:指定列为索引列,默认值为None,索引0是DataFrame对象的行标签
usecols:int、list或字符串,默认值为None
如为None,则解析所有列
如为int,则解析最后一列
如为list列表,则解析列号和列表的列
如为字符串,则表示以逗号分隔的Excel列字母和列范围列表
squeeze:布尔值,默认为False,如果解析的数据只包含一列,则返回一个Series
dtype:列的数据类型名称为字典,默认值为None
skiprows:省略指定行数的数据,从第一行开始
skipfooter:省略指定行数的数据,从尾部数的行开始
4导入指定Sheet页的数据
# sheet_name=0表示第一个sheet页的数据,以此类推,如果不指定,则导入第一页
5指定行索引导入Excel数据
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''
# 导入第一列数据
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''
你好,
获取某个url请求的响应,现在python比较受欢迎的库就是requests了,我就拿requests这个库给你举个简单的例子吧:
requests库最简单的功能应该就是获取某个url请求了,说白了就是使到某个页面的源码, 我在本地搭了个web服务器,在根目录下有一个examplehtml文件,我们在浏览器中访问这个页面会显示 "Hello Friend":
examplehtml文件内容:
访问该文件浏览器的输出:
-------------
接下来我们就使用python的requests库来获取examplehtml的内容:
从上到下四个红框的意思:
导入requests库;
使用requests库的get()方法访问url: >
使用response对象的text属性来获取刚刚访问url的响应内容;
因为responsetext输出的内容没有格式化,所以这里又使用print()函数打印一下,这样看起来更清晰一点
最后我们可以再导入像re这样的正则库去responsetext中拿到我们想得到的内容
一点点建议:
requests库很常用,但建议先稍系统的学一下该库常用的方法和属性,有一个大概的了解,再去找简单的例子练练手,一点点找感觉这样会好一点像requests官方文档应该有中文的,把tutorial看完了简单的一些 *** 作就不在话下了如果你没有学习相应要用的库,然后就按自己的想法去 *** 作,步步都是坎,这样不仅耗时长,而且长时间没有进展会很打击积极性的
希望对你有帮助,欢迎追问
这里有各种策略用于定位网页中的元素(locate elements),你可以选择最适合的方案,Selenium提供了一下方法来定义一个页面中的元素:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
下面是查找多个元素(这些方法将返回一个列表):find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
除了上面给出的公共方法,这里也有两个在页面对象定位器有用的私有方法。这两个私有方法是find_element和find_elements。
常用方法是通过xpath相对路径进行定位,同时CSS也是比较好的方法。举例:
[html] view plain copy
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
定位username元素的方法如下:[python] view plain copy
username = driverfind_element_by_xpath("//form[input/@name='username']")
username = driverfind_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driverfind_element_by_xpath("//input[@name='username']")
[1] 第一个form元素通过一个input子元素,name属性和值为username实现[2] 通过id=loginForm值的form元素找到第一个input子元素
[3] 属性名为name且值为username的第一个input元素
二 *** 作元素方法
在讲述完定位对象(locate elements)之后我们需要对该已定位对象进行 *** 作,通常所有的 *** 作与页面交互都将通过WebElement接口,常见的 *** 作元素方法如下:
clear 清除元素的内容
send_keys 模拟按键输入
click 点击元素
submit 提交表单
举例自动访问FireFox浏览器自动登录163邮箱。
[python] view plain copy
from selenium import webdriver
from seleniumwebdrivercommonkeys import Keys
import time
# Login 163 email
driver = webdriverFirefox()
driverget("")
elem_user = driverfind_element_by_name("username")
elem_userclear
elem_usersend_keys("15201615157")
elem_pwd = driverfind_element_by_name("password")
elem_pwdclear
elem_pwdsend_keys("")
elem_pwdsend_keys(KeysRETURN)
#driverfind_element_by_id("loginBtn")click()
#driverfind_element_by_id("loginBtn")submit()
timesleep(5)
assert "baidu" in drivertitle
driverclose()
driverquit()
首先通过name定位用户名和密码,再调用方法clear()清除输入框默认内容,如“请输入密码”等提示,通过send_keys("")输入正确的用户名和密码,最后通过click()点击登录按钮或send_keys(KeysRETURN)相当于回车登录,submit()提交表单。PS:如果需要输入中文,防止编码错误使用send_keys(u"中文用户名")。
三 WebElement接口获取值
通过WebElement接口可以获取常用的值,这些值同样非常重要。
size 获取元素的尺寸
text 获取元素的文本
get_attribute(name) 获取属性值
location 获取元素坐标,先找到要获取的元素,再调用该方法
page_source 返回页面源码
drivertitle 返回页面标题
current_url 获取当前页面的URL
is_displayed() 设置该元素是否可见
is_enabled() 判断元素是否被使用
is_selected() 判断元素是否被选中
tag_name 返回元素的tagName
以上就是关于python 获取当前页面的是http还是https全部的内容,包括:python 获取当前页面的是http还是https、python提取网页array内容、Python提取网页链接和标题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)