xpath和contains模糊匹配
来源:https://www.cnblogs.com/kaibindirver/p/12072546.html
最近在弄数据爬取,研究了下xpath,也参考了很多文章,这篇总结不错,就直接复制过来了。
常见的用法举例:
#它会取class含有有test1和test2的元素
xpath('//div[contains(@class,"test1") and contains(@class,"test2")]')
#它会取class 含有 test1 或者test2满足时,或者同时满足时的元素
xpath('//div[contains(@class,"test1") or contains(@class,"test2")]')
查找name属性中包含zhangsan关键字的页面元素
//divt[contains(@name,'zhangsan')]
xpath写法为 //a[text()='百度搜索'] 或者 //a[contains(text(),"百度搜索")]
<a href="http://www.baidu.com">百度搜索</a>
#开闭标签之间的文本内容
//a[contains(@class,"news-item-title")]/text()
#选中标签节点中获取指定属性的值
//a[contains(@class,"news-item-title")]/@href
# 选取class属性包含ing的href链接地址
html.xpath("//div/p[2][contains(@class,'ing')]/a/@href")
# 选取价格大于20元书的价格值
html.xpath("//book[price>20.00]/price/text()")
# 选取前2本书
html.xpath("//book[position()<3]/title/text()")
#取div位置大于2的 并且类包含three的
html.xpath("//div[position()>2 and contains(@class,'three')]/@class")
# 豆瓣电影评分大于8的电影
//span[@class="rating_nums"][text()>8]
#xpath定位标签中最后一个元素 last()
//span[@class="comment-info"]//span[last()]
#xpath定位标签中倒数第二个元素 last()
//span[@class="comment-info"]//span[last()-1]
#列表下一页 text()
//div[@class="m-page"]/a[contains(text(),'下一页')]
#在路径表达式中使用"|"运算符,您可以选取若干个路径。
#选取 book 元素的所有 title 和 price 元素。
//book/title | //book/price
#选取文档中的所有 title 和 price 元素。
//title | //price
#选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
//bookstore/book/title | //price
xpath可以以标签定位,也可以@任意属性:
如:以input标签定位:driver.find_element_by_xpath("//input[@id='kw']")
如:@type属性:driver.find_elements_by_xpath("//input[@type='text']")
一、xpath定位
1、常规属性
1.通过id定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("hao")
2.通过tag(标签)定位
*号匹配任何标签:driver.find_element_by_xpath("//*[@id='kw']")
也可以指定标签名称:driver.find_element_by_xpath("//input[@id='kw']")
3.通过class定位
driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("hao")
4.通过name定位
driver.find_element_by_xpath("//input[@name='wd']").send_keys("hao")
2、其他属性
1.其它属性
driver.find_element_by_xpath("//input[@autocomplete='off']").send_keys("hao")
2.多个属性组合(逻辑运算)
driver.find_elements_by_xpath("//input[@type='text' and @name='wd']")
3.绝对路径:/html/body/xxx/xx[@id=‘kw’]
4、层级关系
1.相对路径:层级关系
driver.find_element_by_xpath("//form[@id='form']/span/input")
如:
/代表绝对路径
//代表相对路径
2.索引:如定位搜索选项框
driver.find_element_by_xpath("//*[@id='nr']/option[3]")
3.同一父级多个子元素
如果同一父级下,有多个相同的子元素,下标从1开始:.//*[@id='u1']/a[2]
也可以这样:.//*[@id='u1']/a[@class="mnav"][1]
4、模糊匹配
1.contains模糊匹配text:contains
如,通过模糊匹配text属性,找到百度首页的“糯米”网站超链接
driver.find_element_by_xpath("//a[contains(text(),'糯')]").click()
2.模糊匹配某个属性:contains
xpath("//input[contains(@id,‘xx')]")
driver.find_element_by_xpath("//input[contains(@class,'s_ip')]").send_keys("hao")
3.模糊匹配以xx开头:starts-with
xpath("//input[starts-with(@id,‘xx') ]")
driver.find_element_by_xpath("//input[starts-with(@class,'s_ip')]").send_keys("hao")
5、文本属性
对于这种文本属性,语法:.//*[text()=‘文本内容’]
除了这个文本属性匹配是.//*[text()=‘文本’]这种格式(无@)
其它的属性,如id,name,class等都是.//*[@id=‘xxx’] .//*[@name=‘xxx’]这种格式
二、浏览器调试xpath
1.Firefox调试:无firePath的情况下,控制台下输入$x(xpath定位),回车
2.Chrome调试:Console下输入$x(xpath定位),回车
三、table表格定位
1、定位表格
Table表格固定格式:.//*[@id=‘表格id’]/tbody/tr[行数]/td[列数]/a
.//*[@id='bugList']/tbody/tr[6]/td[4]/a
2、参数化行和列
x = 6
y = 4
table = f".//*[@id='bugList']/tbody/tr[{x}]/td[{y}]/a"
driver.find_element_by_xpath(table).click()
3、根据表格标题定位后面的按钮
1.先通过bug的标题名称找到这一行
2.再找到这一行的父节点
3.通过父节点往下搜(编辑按钮都是固定位置)
text = "上传多个附件"
t = f'.//*[text()="{text}"]/../../td[@class="text-right"]/a[@title="编辑"]'
driver.find_element_by_xpath(t).click()