python网络爬虫-二度进阶篇·Xpath与lxml

1.XPath 语法

1.选取节点

路径表达式 描述
/div/a 从根节点开始选取div节点下的a节点
/div/a[2]/img 从根节点开始选取div节点下的第二给a节点下的img节点
//div[@class='header-wrapper' 选取所有属性class的值为header-warpper的div节点
//* 选取文档中所有元素
//@* 选取文档中所有带属性的元素

2.谓语

查找特定的节点或者包含某个指定值的节点,会被嵌在方括号中。

路径表达式 描述
/div/p/text() 选取p节点的文本内容
/div[contains(@class,"post")] 选取带有class属性且包含"post"的所有div节点,取反//div[not(contains(@class,"post"))]
//div/p[last()-1] 选取div下倒数第二个p节点
//div/p[position()>1] 选取div下第二个p节点后的所有兄弟节点

 参考网页(菜鸟教程):XPath 语法 | 菜鸟教程 (runoob.com)

2.lxml 库

支持XPath,通常用于定位特定的元素及节点信息。

1.解析 HTML 代码块:

from lxml import etree
html_data = '''

'''
html = etree.HTML(html_data)
#构建出完整的html文档,会自动对html补全
print(etree.tostring(html).decode())
#返回element节点树,是类。
print(type(html))

输出结果:略 ;

2.联动Xpath选择器:(html代码中内容同上)

1.使用//返回一个列表

from lxml import etree
html_data = '''
balabalabala
'''
html = etree.HTML(html_data)
result = html.xpath("//li/a/text()")
print(result)

输出结果:['first item', 'second item', 'fourth item', 'fifth item'] 

2.获得元素的属性值

result = html.xpath("//li/@class")

输出结果:['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0'] 

3.根据属性值获取元素内容

result = html.xpath("//li/a[@href='link1.html']/text()")

输出结果:['first item']

4.//返回所有匹配的

result1 = html.xpath("//li//span/text()")

输出结果:['third item']

result2 = html.xpath("//li[last()]/a/@href")

输出结果:['link5.html']

3.lxml综合练习

范例网址:机械工业出版社产品详情

import requests
from lxml import etree

def handle_detail_xpath(content):
    html = etree.HTML(content)
    all_book = html.xpath("//div[@class='detailrightnewbook']")
    for item in all_book:
        print({
            "title":item.xpath("//p[@class='detailbooktitle']/text()")[0],
            "author": item.xpath("//p[@class='detailbooktitleone']/text()")[0],
            "ISBN": item.xpath("//p[@class='detailbooktitleone']/text()")[1],
            "price":item.xpath("//p[@class='detailbooktitleone']/text()")[2],
        })
def main():
    header = {
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
    }
    for i in range(332624,332628):#搜索范围
        url = "http://www.cmpbook.com/products/detail?id={}".format(i)
        response = requests.get(url=url,headers=header)
        handle_detail_xpath(response.text)

if __name__ == '__main__':
    main()

 4.综合练习2

from lxml import etree

content = """

 
 
  

你可能感兴趣的:(python爬虫,html,xml,python)