Python爬虫对数据的响应分析库lxml,bs4的使用

爬虫获取网页后 对网页的解析方法中常用的两种。lxml, bs4库

pip install lxml
pip install bs4

lxml 解析使用

xpath语法。https://www.w3school.com.cn/xpath/xpath_syntax.asp

from lxml.html import etree

html = '''
<html>
<div>
    <h2>功夫联盟演员列表</h2>
    <ul>
         <li class="item-0"><a href="link1.html">赵文卓</a></li>
         <li class="item-1 item-3"><a href="link2.html">安志杰</a></li>
         <li class="item-0"><a href="link3.html">麦迪娜</a></li>
         <li class="item-1"><a href="link4.html">张子文</a></li>
         <li class="item-0"><a href="link5.html">梁小龙</a></li>
         <li class="item-1"><a href="link6.html">飞儿</a></li>
         <li class="item-0"><a href="link4.html">林子总</a></li>
         <li class="item-1"><a href="link5.html">张瑶</a></li>

    </ul>
</div>
</html>
 '''


# /   从根节点选取。
#     /div    选取根元素 div。    注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
# //  从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
#     //li    选取所有li子元素,而不管它们在文档中的位置。


tree = etree.HTML(html)

# tree.xpath() 返回结果是一个列表。。。
# 列表可能为空(未找到响应属性)
# 不为空是里面元素是<class 'lxml.etree._Element'>, 可继续进行查找

print(type(tree))    # <class 'lxml.etree._Element'>

print(tree.xpath("/html//div"))

# 1. 获取文件中所有的li标签
res1 = tree.xpath("//li")
print(type(res1))   # <class 'list'>
# print(res1)         # <Element li at 0x1fad14a6808>, <Element li at 0x1fad14a6848>, ......]
print(type(res1[0]))    # <class 'lxml.etree._Element'>
print(tree.xpath("//li/a/text()"))
# 2. 查询class属性等于“item-1” 标签  =  !=
print(tree.xpath("//*[@class='item-1']/a/text()"))
# 3. 查询li标签,class包含item字符串
print(tree.xpath("//*[contains(@class, 'item')]/a/text()"))
# 4. 查询li标签,class 不包含item字符串
print(tree.xpath("//*[not(contains(@class, 'item'))]/a/text()"))
# 5. 查询li标签,最后一个
print(tree.xpath("//li[last()]/a/text()"))
# 6. 查询前3个li标签  = < <= > >= !=
print(tree.xpath("//li[position()<=3]/a/text()"))
# 7. text()  和 string()    string可以跨标签取文本,text()只能取当前标签
print('/text()',tree.xpath('//li/text()'))
print("/string()",tree.xpath('string(//li)'))
print(tree.xpath("string(.)"))
# 8. 获取属性
print(tree.xpath("//li/@class"))
print(tree.xpath("//li/a/@href"))
# 9. 逻辑表达式 |    可以看做多个列表合集
print(tree.xpath("//h2/text() and //li/a/text()"))
elements = tree.xpath('//h2/text()|//li/a/text()')
elements1 = tree.xpath('//h2/text()')
elements2 = tree.xpath('//li/a/text()')
print(len(elements))
print(len(elements1+elements2))

# 依次打印每个演员链接和姓名
liList = tree.xpath("//li")
print(liList)   # [<Element li at 0x1ab8bd404c8>, <Element li at 0x1ab8c0d0708>...]
for li in liList:
    print(li.xpath("./a/@href")[0], end='\t') # .xpath()返回值是一个列表。即使列表中只有一个元素。
    print(li.xpath("./a/text()")[0])

bs4库基本使用

from bs4 import BeautifulSoup
from bs4.element import Tag
# 知识点:
# 1. 安装  pip install bs4
# 2. 学习BeautifulSoup类: 构造方法有哪些参数、有哪些属性、有哪些方法
# BeautifulSoup对象可以找Tag
# 3. bs4.element.Tag类: 构造方法有哪些参数、有哪些属性、有哪些方法
# Tag对象可以找tag

html = """
<h2>古龙小说全集</h2>
<div  class="nav">
    <ul>
        <li><a href="/cang/" title="苍穹神剑" target="_top">苍穹神剑</a></li> 
        <li><a href="/duo/" title="多情剑客无情剑" target="_top">多情剑客无情剑</a></li> 
        <li><a href="/jue/" title="绝代双骄" target="_top">绝代双骄</a></li> 
        <li><a href="/yue/" title="月异星邪" target="_top">月异星邪</a></li> 
    </ul>
</div>
<div class="index"><span>目录</span><a href="/"><img src="images/icon.png" /></a></div>
"""

# 第二个参数是一个解析器。
soup = BeautifulSoup(html, features='lxml')
print(dir(soup))

# 1. 按tag查找元素   # 只返回一个元素
# print(soup.div)
print(soup.h2)
element = soup.h2
print(type(element))
print(dir(element))
# 2. tag name 可以进行多级
print(soup.li.a)
print("2",soup.li.a.get("href"))
# 3. 获取元素的文本    text 可以跨标签 而string不可以
print(soup.ul.string)   # None
print(soup.ul.text)
# 4. 获取tag的属性值 比较智能。。。可以判断属性可能有多个值或是单个值
print("4",soup.li.a["title"])       # str
print("4",soup.li.a.get("title"))   # str
print("4",soup.div["class"])        # list
print("4",soup.div.get("class"))    # list
print("4",soup.div.attrs)           # dict
# 5. find_all   找符合条件的所有元素 上面的只是找单个元素
'''
find_all(name, attrs, recursive, text, limit, **kwags)
- name: 按tag查找  eg:soup.find_all('div')
- attrs: 属性过滤条件  eg: soup.find_all('div', attrs={'class': ''})
- recursive: 是否递归,默认值是True
- text:按tag的内容查找  eg: soup.find_all(text="hhhhhhh")
- kwargs: 关键参数     eg:  soup.find_all(id="")
    eg:  soup.find_all(class_="")
- limit: 用来限制查找到的结果的个数。 eg: soup.find_all("li", limit=2), 代表查找前两个name为li的标签
'''
print(soup.find_all("li"))
# 使用findall方法获取的返回值类似一个列表 和列表几乎一摸一样  而内部元素是一个Tag。
from bs4.element import ResultSet
books = soup.find_all("li")     # <class 'bs4.element.ResultSet'> 
for book in books:
    print(book.text)
print(soup.find_all("li"))

# 6. find  ==  find_all(limit=1)
print(soup.find("li"))
li = soup.find("li")
print(type(li), li.text)
发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dandanfengyun/article/details/104244667