python 爬虫中,必然会接触到 HTML 解析。 lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取。市面上有很多现成的XML解析器,但是为了获得更好的结果,开发人员有时更愿意编写自己的XML和HTML解析器。这时lxml库就派上用场了。这个库的主要优点是易于使用,在解析大型文档时速度非常快,归档的也非常好,并且提供了简单的转换方法来将数据转换为Python数据类型,从而使文件操作更容易。
html = etree.HTML(html.lower().decode('utf-8')) a_links = html.xpath("//a") # 查找所有 a 标签 //a 代表 html 下所有 a for a_link in a_links: print("*"*30) print(a_link.attrib) # 获取属性 print(a_link.text) # 获取 a 标签 text
XPATH 基本上是用一种类似目录树的方法来描述在XML文档中的路径。用 “/“ 来作为上下层级间的分隔。第一个 “/“ 表示文档的根节点。对于一个 HTML 文件来说,最外层的节点是 “/html”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from lxml import etree
html = ''' <html> <head> <meta name="content-type" content="text/html; charset=utf-8" /> <title>Test</title> </head> <body> <h1>I am h1 html</h1> <p style="font-size: 50%">Hello World</p> <p>Hello World 2</p> </body> </html> '''
通过绝对路径查找
1 2 3 4 5 6 7 8 9 10 11
html = etree.HTML(html.lower().decode('utf-8')) # 找到 html 下 body 内的 p 。 注意 xpath 返回的不一定唯一的,是符合要求的所有节点 # 也可用用 //p 查找 html 下所有 p p_tags = html.xpath("/html/body/p") for p_tag in p_tags: print("*"*30) # p_tag 是一个 lxml.etree._Element 对象 print(p_tag.text) # 获取文本内容 print(a_link.values()) # 获取所有属性值
1 2 3 4 5 6
# 输出结果 ****************************** Hello World font-size: 50% ****************************** Hello World 2
html = etree.HTML(html.lower().decode('utf-8')) p_tag = html.xpath("/html/*/p[@style='font-size: 50%']") # 加 * 号 不管 html 到 p 中间有多少层,不管当前 p 的上一级是 div 还是什么,都会被查找出来