xpath语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
. . | 选取当前节点的父节点。 |
@ | 选取属性。 |
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>59.0</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
用法:
路径表达式 | 结果 |
---|---|
bookstore | 选取根元素 bookstore |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position()❤️] | 选取最前面的2个属于 bookstore 元素的子元素的 book 元素 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=’eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
- //book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
- //title | //price 选取文档中的所有 title 和 price 元素。
- /bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title元素,以及文档中所有的 price 元素
1 starts-with():获取以…开头的元素
xpath(‘//div[stars-with(@class,”cs”)]’)
2 contains():获取包含…的元素
xpath(‘//div[contains(@id,”cs”)]’)
3 and:与的关系
xpath(‘//div[contains(@class,”cs1”) and contains(@class,”cs2”)]’)
4 text():
(1):xpath(‘//div[contains(text(),”cs”)]’)
(2):xpath(‘//div[@id=”cs“]/text()’)
轴
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute | 选取当前节点的所有属性 |
child | 选取当前节点的所有子元素 |
descendant | descendant 选取当前节点的所有后代元素(子、孙等) |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 |
following | 选取文档中当前节点的结束标签之后的所有节点 |
namespace | 选取当前节点的所有命名空间节点 |
parent | 选取当前节点的父节点 |
preceding | 选取文档中当前节点的开始标签之前的所有节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
self | 选取当前节点 |
详细语法介绍参考:
https://www.w3school.com.cn/xpath/xpath_axes.asp
简单使用
import requests
from lxml import etree
#使用xpath
base_url = 'https://www.58pic.com/piccate/41-0-0-fo5.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
response = requests.get(url = base_url,headers = headers)
html = etree.HTML(response.content)
result_divlist = html.xpath('//div[@class="pic-box clearfix "]/div[@class="qtw-card"]')
num = 0
for div in result_divlist:
num+=1
img_url = div.xpath('./a/div[@class="image-box"]/img/@data-original')[0] #//preview.qiantucdn.com/58pic/35/63/97/auto_258PIC58PIC58PICi8k58PICRQ7sP58PIC8R6_PIC2018.jpg!qt324_nowater
img_base = 'http:'+img_url
img_response = requests.get(url = img_base,headers = headers)
if(num<=4):
with open('./images/{}.png'.format(num),'wb') as f:
f.write(img_response.content)