xpah
什么是html
<!DOCTYPE html>
<html lang='zh'>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</htm l>
xpath是用在XML文档中定位元素的语言。
xpath通过路径来查找元素。
HTML是一种树形结构,所有的节点都是从根节点发散而来,每个节点具有属性和文本。
路径就是某个节点到另一个节点的路线。
节点关系:
父节点:parent,上一级节点。
子节点:child,下一级节点。
兄弟节点:sibling,同级节点,拥有相同的父节点。
祖先节点:ancestor,爷爷辈及以上节点。
后代节点:descendant,孙辈及以下节点。
绝对路径:可能会有变化。
相对路径:可以选取一个可以定位到唯一的元素,增加查找的准确性,一般xpath中都使用相对路径。
语法:
/:从根节点开始
//:从任意节点开始
.:选取当前的节点
…:选取当前节点的父节点
@:选取属性
*:通配符,表示任意系节点或者任意属性。
//img[@class="main_img img-hover"]
[ ]可以看成是if判断条件
…:上一级,以上述为例代码为:
from scrapy.selector import Selector
from scrapy.selector import Selector
text = """
<html>
<table class = 'table'>
<tr class = 'xm'>
<td class = 'xm1'>xm1</td>
<td class = 'xm2'>xm2</td>
<td class = 'xm3'>xm3</td>
<td class = 'xm4'>xm4</td>
<td class = 'xm5'>小王 </td>
</tr>
</table>
</html>
"""
函数:
text():节点的文本
取得是tr下td的文本。
result = html.xpath("//tr[@class='xm']//text()").getall()
print(result)
string():取得是string()内的内容:
result = html.xpath("string(//tr[@class='xm'])").get()
starts-with():表示选择以指定字符开头的id属性
result = html.xpath("//td[@class = 'xm1']/..").get()
print(result)
position():取第三个标签以后的
result = html.xpath("//tr[@class = 'xm']/td[position()>3]").getall()
print(result)
chilid:子类节点
result = html.xpath("//tr[@class='xm']/child::*").getall()
print(result)
-sibling:兄弟节点
result = html.xpath("//td[@class='xm4']/following-sibling::*[1]").get()
print(result)#结果取到的是xm4下面的一个兄弟节点。
following换行符的注意
选取文档中当前节点的结束标签,之后的所有节点。不论是什么节点
result = html.xpath("//td[@class='xm3']/following::text()").getall()
print(result)
preceding:选取文档中当前节点的开始标签之前的所有节点。
与following不同的是,following是向下,preceding则是从上向下。
contains():表示选择id中含有指定字符的div节点
包含:
result = html.xpath("//td[contains(@class,'xm')]").getall()
print(result)#@class也可以换成text()属性要加@,函数不用加
正则表达式:xpath中可以运用正则表达式。[re:mach()]用法与contains相同。
result = html.xpath("//td[re:match(@class,'xm\d+')]").getall()
print(result)
not,and
result = html.xpath("//td[contains(@class,'xm') and not (contains(text(),'小王'))]").getall()
print(result)
re_first()可以用来提取数字。