Python 通过lxml 解析html页面自动组合xpath实例
#coding:utf-8
'''
@author: li.liu
'''
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionBuilder, ActionChains
from lxml import etree
import urllib
import time
import re #url='http://www.baidu.com'
url='www.woyihome.com'
driver= webdriver.Chrome()
driver.get(url)
web_title=driver.title
def test1():
head=driver.current_window_handle
print driver.current_url
xpathset=set()
try:
html1=urllib.urlopen(url).read().decode('utf-8')
hetree=etree.HTML(html1)#lxml解析html
lxml1=etree.ElementTree(hetree)#lxml.etree解析html
hiter=hetree.iter()#加载到迭代器中
#print hiter
str1='' for t in hiter:#遍历每个元素
for item in t.items():#遍历每个元素的属性
c=0
d=0
for i in item:#遍历每个属性的名字和值
if i == 'id':#查找属性名为id的元素
str1 ='//*[@'+i+'="'+item[c+1]+'"]'##通过id属性值定位达到元素
xx=lxml1.xpath(str1)#查找元素
#print '\n',xx
lgx=lxml1.getpath(xx[0])#查找元素路径
#print lgx
s= lxml1.xpath(str1+'//*')#查找子元素生成list列表
for s1 in s:#遍历所有属性为str1的子元素
#print s1.text
#print lxml1.getpath(s1)
for ss1 in s1.items():#遍历str1子元素的属性
for sss1 in ss1 :#遍历属性名和值
try:
#print sss1
lgs1=lxml1.getpath(s1)#获取str1子元素s1的路径
path_split=lgs1.split(lgx)[1]#分割子处理元素属性值的字符串
str3=str+path_split#生成xpath
print '\n',str3
xpathset.add(str3) except:pass
#else:
#pass
#print lxml1.getpath(s1)
#print i,'\n'
c+=1
d+=1
print '.',
print '\r'
'''
for i in xpathset:
print i try:
driver.find_element_by_xpath(i).text
driver.find_element_by_xpath(i).click()
durll=driver.current_url
headx=driver.window_handles
#print headx
print '当前页面地址:\n',durll
time.sleep(1)
print i,'\n'
if len(headx)!=1:
driver.switch_to_window(headx[1])
durl= driver.current_url
print '当前页面地址:\n',durl,'\n'
if '101.37.179.183' in durl:
driver.close()
driver.switch_to_window(headx[0])
else:
k=1
break else:
driver.get(url) except:
pass
'''
print len(xpathset)
#print '\t' #driver.get('http://101.37.179.183')
#print driver.title finally:
#driver.quit()
print '...'
'''
try:
time.sleep(1)
#print driver.find_element_by_xpath('//*[@id="wrapper"]'),1
#print driver.find_element_by_xpath('//*[@id="wrapper"]/div[2]/a[1]')
driver.find_element_by_xpath(str1)
time.sleep(50000)
finally:
print 3
driver.quit()
''' def test2():
http_dict={}
durll=''
http_dict[durll]=[]
head=driver.current_window_handle
xpath_dict={}
xpathset=set()
#try:
html1=urllib.urlopen(url).read().decode('utf-8')
hetree=etree.HTML(html1)#lxml解析html
lxml1=etree.ElementTree(hetree)#lxml.etree解析html
hiter=hetree.iter()#加载到迭代器中
#print hiter
hid1=lxml1.xpath('//*[@id]')
hid=lxml1.xpath('//*[@id]//*')
for t in hid1:
id_items=t.items()
print t.items()#打印id属性的元素所有属性
tpath=lxml1.getpath(t)
print tpath#打印id属性的元素的路径 for id in id_items:
if 'id' in id[0]:
str1='//*[@id="'+id[1]+'"]'
xpath_dict[str1]=[]
#print xpath_dict
print str1
str3=str1+'//*'
print str3
id_list= lxml1.xpath(str3)
for idist in id_list:
idpath= lxml1.getpath(idist)
idxpathlist=idpath.split(tpath)
if len(idxpathlist)>1:
id_xpath=str1+idxpathlist[1]
xpath_dict[str1].append(id_xpath)
#print xpath_dict[str1]
#print idxpathlist
#else:
#print '+++++++++++++++++++++++++++++++++++++++'
#print idxpathlist,'stop',len(idxpathlist)
print '=============================================='
cont=0
k=0 for i in xpath_dict:
#print xpath_dict[i]
for t in xpath_dict[i]:
durll=''
try:
time.sleep(1)
elem_text=driver.find_element_by_xpath(t).text
driver.find_element_by_xpath(t).click()
durll=driver.current_url
headx=driver.window_handles
#print headx if len(headx)!=1:
driver.switch_to_window(headx[1])
durll= driver.current_url
print '链接元素名:',elem_text
print '页面名:',driver.title
print '当前页面地址:\n',durll
print t,'\n'
if '101.37.179.183' in durll:
driver.close()
driver.switch_to_window(headx[0])
else:
k=1
break
else:
if driver.title !=web_title:
print '链接元素名:',elem_text
print '页面名:',driver.title
print '当前页面地址:\n',durll
print t,'\n'
driver.back()
pass except:
if k==1 or 'localhost' in durll:
pass
else:
try:
print '动态首项xpath:',dict[i][0]
elem=driver.find_element_by_xpath(xpath_dict[i][0])
ActionChains(driver).move_to_element(elem).perform()
time.sleep(1)
driver.find_element_by_xpath(t).click()
print '当前动态页面地址为:','\n',driver.current_url
print t,'\n'
if driver.title !=web_title:
t1= '链接元素名:'+elem_text
t2= '页面名:'+driver.title
t3= '当前页面地址:'+durll
print t1,'\n',t2,'\n',t3,'\n',t,'\n'
http_dict[durll].append(t1)
http_dict[durll].append(t2)
http_dict[durll].append(t3)
driver.back()
except(Exception):
pass
#print Exception cont+=1
print cont with open('E:/1/http.txt', 'w') as handle:
for t in http_dict:
str2=t+''+str(http_dict[t])
handle.writelines(str2) test2()
print '结束'
#driver.quit()
Python 通过lxml 解析html页面自动组合xpath实例的更多相关文章
- Python爬虫 | Beautifulsoup解析html页面
引入 大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据.因此,在聚焦爬虫中使用数据解析.所以,我们的数据爬取的流程为: 指定url 基于reque ...
- Python 之lxml解析库
一.XPath常用规则 二.解析html文件 from lxml import etree # 读取HTML文件进行解析 def parse_html_file(): html = etree.par ...
- python的lxml解析器
from lxml import etree import codecs import sys from lxml import etree def parser(p): tree = etree.H ...
- Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息
本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...
- Python爬虫之解析网页
常用的类库为lxml, BeautifulSoup, re(正则) 以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/ ...
- python爬虫中XPath和lxml解析库
什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...
- python爬虫网页解析之lxml模块
08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...
- python在lxml中使用XPath语法进行#数据解析
在lxml中使用XPath语法: 获取所有li标签: from lxml import etree html = etree.parse('hello.html') print type(html) ...
- python中html解析-Beautiful Soup
1. Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...
随机推荐
- MySQL5.7的sql脚本导入到MySQL5.5出错解决
今晚有人让我将他的数据库导入到我的mysql里,执行导入后发现有报错 想了下可能是版本的问题,询问了下,他的数据库是5.7而我的是5.5 他给我提议升级mysql版本,但是我就是不想换版本 那怎么在不 ...
- SQL Server 2019 新版本
2019 年 11 月 4 日,微软在美国奥兰多举办的 Ignite 大会上发布了关系型数据库 SQL Server 的新版本.与之前版本相比,新版本的 SQL Server 2019 具备以下重要功 ...
- Java基础教程(26)--反射
一.类 对于每一种类型的对象,Java虚拟机都会实例化一个java.lang.Class类的不可变实例.该实例提供了获取对象的运行时属性的方法,包括它的成员和类型信息.Class类还提供了创建新实 ...
- Python之logging.basicConfig函数各参数
filename: 指定日志文件名 filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a' format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所 ...
- unity---为什么用Time.deltaTime * speed 表示每秒移动的距离的理解
Time.deltaTime:代表时间增量,即从上一帧到当前帧消耗的时间, 这个值是动态变化的. dt 表示 deltaTime. 假如 1s渲染10帧,沿X轴方向的移动速度 speed = 10m/ ...
- [cf 1239 B] The World Is Just a Programming Task (Hard Version)
题意: 给你一个长度为n的括号序列,你可以交换其中的两个元素,需要使该序列的n个循环移位中合法的括号序列个数尽量多. 输出最大的答案以及交换哪两个元素能够取到这个答案. $n\leq 3\times ...
- Spring中的ApplicationListener的使用详解案例
本文链接:https://blog.csdn.net/u010963948/article/details/83507185 1.ApplicationContext Spring的核心,Contex ...
- java之基本技术点总结博客
泛型的理解 聊一聊-JAVA 泛型中的通配符 T,E,K,V,? 类,接口的继承和实现的规则 类与类之间只能继承,并且是单继承,可以多级继承 类与接口之间可以实现,一个类可以实现多个接口 接口和接口之 ...
- 没有足够的内存继续执行程序(mscorlib)
原文:https://blog.csdn.net/yao940622/article/details/79690953 问题描述: 在Microsoft SQL Server Management S ...
- P1018 乘积最大(DP)
题目 P1018 乘积最大 解析 区间DP 设\(f[i][j]\)表示选\(i\)个数,插入\(j\)个乘号时的最大值 设\(num[i][j]\)是\(s[i,j]\)里的数字 转移方程就是\(f ...