python中XPath与bs4的简单使用

XPath是XML路径语言,它是一种用来确定XML文档中某部分位置的语言。

在python爬虫方面的学习中,xpath至关重要,它与正则相比具有明显的优势。下面将介绍在python中xpath的简单使用。

安装方法不必多说,与其他第三方库的安装方法一样,使用pip安装。

使用方式

首先需要导入库

import lxml.html

接下来就是使用了,话不多说,上代码

# 使用方式介绍
#---------------------------------
#/     从根标签开始
#//    从当前标签
#*     通配符,选择所有
#//div/book[1]/title  选择div下第一个book标签的title元素
#//div/book/title[@lang='zh'] 选择title属性含有lang且内容为zh的title元素
#//div/book/title[@*] 将含有属性的title标签选出来
#//div/book/title/@*  将title标签中的属性值选出来
#//div/book/title/text() 选出title标签中的内容,使用内置函数text()
#//div/book/title  //book/title  //title具有相同的结果
#//a[@href='link1.html' and @id='places_neighbours__row'] 把两个条件都满足的a标签选出来
#//a[@href='link1.html' or @id='places_neighbours__row'] 把满足任意一个条件的a标签选出来
#//a[not(@href)] 将不存在href元素的a标签选出来
#//a[@href!='link1.html'] 将存在href元素 但不等于link1.html的a标签选出来
#//li[starts-with(@class,'item')] 将class属性前缀是item的li标签选出来
#//li[contains(@class,'ct')] 将class属性中含有ct关键字的li标签选出来
#//div/book[last()]/title/text() 将最后一个book元素中title内容选出来
#//div/book[last()-1]/title/text() 将倒数第二个book元素中title内容选出来
#//div/book[price > 39]/title/text() 将book中price标签中的内容大于39的选出来
#//book/descendant::* 将后续节点全部选出
#//book/ancestor::* 将祖先节点全部选出

#示例
#------------------------------
test_data = """
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html" id="places_neighbours__row">9,596,960first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html" id="places_neighbours__row">fourth item</a></li>
                 <li class="item-0"><a>fifth item</a></li>
                 <li class="bectter"><a>fifth item</a></li>
             </ul>
             <book>
                    <title lang="eng">Harry Potter</title>
                    <price>29.99</price>
            </book>
            <book>
                <title lang="zh" id="places_neighbours__row">Learning XML</title>
                <price>38</price>
            </book>
            <book>
                <title>Python</title>
                <price>55.55</price>
            </book>
         </div>
        """
html = lxml.html.fromstring(test_data)
# html_data = html.xpath("//div/book/title[@lang='zh']")
# html_data = html.xpath("//div/book/title[@*]")
# html_data = html.xpath("//div/book/title/@*")
# html_data = html.xpath("//div/book/title/text()")
# html_data = html.xpath("//a[@href='link1.html' and @id='places_neighbours__row']/text()")
# html_data = html.xpath("//a[@href='link2.html' or @id='places_neighbours__row']/text()")
# html_data = html.xpath("//a[not(@href)]/text()")
# html_data = html.xpath("//a[@href!='link1.html']/text()")
# html_data = html.xpath("//li[@class!='item-0' and @class!='item-1']/a/text()")
# html_data = html.xpath("//div/book[last() ]/title/text()")
# html_data = html.xpath("//div/book[price = 39]/title/text()")
# html_data = html.xpath("//div/book[price < 39 and price >30]/title/text()")
# html_data = html.xpath("//li[starts-with(@class,'item')]/a/text()")
html_data = html.xpath("//li[contains(@class,'ct')]/a/text()")
# html_data = html.xpath("//book/descendant::*")
# html_data = html.xpath("//book/ancestor::*")
# html_data = html.xpath("//div/ul/li[@class='item-0'][1]/a/text()")
print(html_data)
for i in html_data:
    print(type(i))


bs4

bs4可以说是别人将xpath再进行了封装,然后供我们使用的更简单的方法,当然,它跟xpath相比运用更简单,但是没有xpath功能全。在实际的爬虫运用中,一些简单的网站爬取不需要用xpath,当然更不需要用正则,这个时候我们可以使用bs4。

导入方法

from bs4 import BeautifulSoup

基本运用

soup = BeautifulSoup(test_data,'lxml')

#基本功能介绍
#--------------------
#标签和属性
# print(soup.a)#获取标签
# print(soup.a['href'])#获取标签属性
# print(soup.a.text)#获取标签内容 .contents也可以
# a_list = soup.find_all("a")#获取所有a标签

#示例
#---------------------
# for a in a_list:
#     print(a.text)
# print(soup.li.contents[0]['href'])
#选出id=places_neighbours__row的所有a标签
# a_place = soup.find_all("a",id="places_neighbours__row")
# print(a_place)
#选出id=places_neighbours__row的所有标签
attrs_place = soup.find_all(attrs={"id":"places_neighbours__row"})
print(attrs_place)

最后,附上一个运用xpath爬取糗事百科的代码。。

import requests
import lxml.html

class ParseXpath:
    def __init__(self,page):
        """
        初始化对象
        :param page:页码 
        """
        #请求头
        self.headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        }
        #代理IP
        self.proxies = {"http":"http://39.137.69.6:80"}
        self.request = requests.get('https://www.qiushibaike.com/8hr/page/'+str(page)+'/',proxies=self.proxies,headers=self.headers)

    def parse_xpath(self,text):
        """
        标签匹配函数
        :param text: 页面内容
        :return: 匹配到的内容
        """
        html = lxml.html.fromstring(text)
        html_data = html.xpath("//*/div/a[1]/div/span/text()")
        return html_data

    def save_info(self,data_lists):
        """
        保存到文档中
        :param data_lists:数据列表
        :return:
        """
        for i in data_lists:
            with open('./txt/01.txt','ab') as f:
                f.write(i.encode('utf-8'))
    def run(self):
        """
        运行函数
        :return: 
        """
        lists = self.parse_xpath(self.request.text)
        self.save_info(lists)
parse = ParseXpath(4)
parse.run()

欢迎各位积极评论,本人刚开始做爬虫,希望与各位共同学习,共同进步。

猜你喜欢

转载自blog.csdn.net/j123__/article/details/82532546