标签元素:
LXML是处理和分析HTML的高效的库,它支持xpath语法。第一步引入lxml库
form lxml import etree
lxml的Element类是处理html 结点的基本类,一个Element可以看作一个html标签元素,看作标签元素
它应有,文本,属性(root.attrib ),节点名(root.)。
>>> root=etree.Element("root")
>>> type(root)
<class 'lxml.etree._Element'>
>>> root=etree.Element( "body" , name="names" )
>>> root.attrib
{'name': 'names'}
>>> root.text="my_names"
>>> etree.tostring( root )
b'<body name="names">my_names</body>'
以上代码中建立一个 tagname为 :body , 属性:name=“names” ,文本:my_names 的 Element 类
root.attrib , root.text , root.tag 。
子元素问题:
>>> root.append( etree.Element("child1") )
>>> child2 = etree.SubElement(root, "child2")
>>> child3 = etree.SubElement(root, "child3")
以上是给 root 对象 添加 子对象 (及root 标签内套 子标签),可看为可遍历的对象:
>>> child = root[0]
>>> print(child.tag)
child1
>>> print(len(root))
3
>>> root.index(root[1]) # lxml.etree only!
1
>>> for child in root:
... print(child.tag)
child0
child1
child2
child3
xpath语法:
>>> html = etree.Element("html")
>>> body = etree.SubElement(html, "body")
>>> body.text = "TAIL"
>>> html.text="TEXT"
>>> etree.tostring(html)
b'<html>text<body></body></html>'
>>> print(html.xpath("//text()")) # lxml.etree only!
['TEXT', 'TAIL']
>>> build_text_list = etree.XPath("//text()") # lxml.etree only!
>>> print(build_text_list(html))
['TEXT', 'TAIL']
标签搜索:
find():返回第一个匹配对象,并且xpath语法只能使用相对路径(以’.//’开头);
findall():返回一个标签对象的列表,并且xpath语法只能使用相对路径(以’.//’开头);
xpath():返回一个标签对象的列表,并且xpath语法的相对路径和绝对路径。
>>> root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>")
>>> x=root.find('.//a[@x]')
>>> x
<Element a at 0x2242c10>
>>> x.text
'aText'
>>> x.tag
'a'
>>> x2=root.findall('.//a[@x]')
>>> x2
[<Element a at 0x2242c10>]
>>> type(x2)
<type 'list'>
>>> x3=root.xpath('//a[@x]')
>>> type(x3)
<type 'list'>
>>> x3
[<Element a at 0x2242c10>]
解析HTML
from lxml import etree
import requests
from chardet import detect
url='http://tool.chinaz.com/'
resp=requests.get(url,timeout=50)
html=resp.content
#识别编码
cder=detect(html)
html=html.decode(cder.get('encoding'))
tree=etree.HTML(html)
#打印全部a标签
hrefs=tree.xpath('//a')
for href in hrefs: