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 ...
随机推荐
- mysql8.0安装时,Unable to connect to any of the specified MySQL hosts
https://blog.csdn.net/u014776759/article/details/88422967
- mysql慢查询及查询优化
mysql默认是没有开启慢查询的 1 查看慢查询的配置状态 show variables like 'slow_query%'; slow_query_log 慢查询开启状态 slow_query_l ...
- [转帖]redhat7.6Linux安装Oracle19C完整版教程
redhat7.6Linux安装Oracle19C完整版教程 https://www.oracle.com/technetwork/database/enterprise-edition/downlo ...
- 手撕面试官系列(五):Tomcat+Mysql+设计模式面试专题
Tomcat (面试题+答案领取方式见侧边栏) Tomcat 的缺省端口是多少,怎么修改? tomcat 有哪几种 Connector 运行模式(优化)? Tomcat 有几种部署方式? tomcat ...
- error adding symbols:DSO missing from command line
编译时加上-lz,如果是使用eclipse,则在添加库z
- c++11多线程记录4:死锁
简单示例 举个例子,桌上有一支笔和一张纸,小A和小B都要拿到纸笔写字 小A拿了笔,小B拿了纸,这时就形成了死锁(两人都不愿意让出纸笔). 其实只要稍加控制就可以避免这种情况:规定必须先拿到纸再能去尝试 ...
- vue的特殊指令 v-if v-once v-bind v-for v-on v-model
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Jenkins基于https的k8s配置
一.摘要 jenkins 连接低版本的k8s时,不需要验证.但是新版本的启用了https和角色管理 二.安装kubernetes插件 登录jenkins,点击 Manage Jenkins --> ...
- ODBC数据导入
这个方法其实是导入excel 首先进入pl/sql dev (1):tools-->ODBC importer (2):点击connect,选择需要导入的excel (3):如果事先数据库中没有 ...
- Drool7s kmodule的作用--系列02课
本文是介绍drool7s kmodule. 一.为什么komdule.xml文件一定要放在resources下的META-INF文件夹中 --->直接看源码吧,请看下图,应该都知道为什么要放在固 ...