美文网首页爬虫python 爬虫爬虫搜集
010 - 使用BeautifulSoup和XPath抓取结构化

010 - 使用BeautifulSoup和XPath抓取结构化

作者: 向右奔跑 | 来源:发表于2017-05-03 00:05 被阅读2047次

    仍然以糗事百科 http://www.qiushibaike.com/text/ 的段子数据抓取来说明。

    结构化数据,就是对应一个数据块,编程中的一个对象,数据库中的一条记录。

    结构化数据抓取的原则,循环点要放在包含整块数据标签处。即『先取大再取小』。

    抓取数据字段:

    • 段子作者
    • 段子内容
    • 好笑数
    • 评论数

    选取的循环点放在这个div上,使用class属性,不要使用id

    <div class="article block untagged mb15" id='qiushi_tag_118966710'>
    

    直接上代码。大家重点掌握 XPath�的方法。bs4的selector,还是 XPath,都是用Chrome工具来 copy ,再根据网页结构作一些调整。

    一、使用BeautifulSoup

    # coding=utf-8
    
    import requests
    from bs4 import BeautifulSoup
    
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
    headers={"User-Agent":user_agent}  #请求头,headers是一个字典类型
    
    html = requests.get('http://www.qiushibaike.com/text/',headers=headers).content
    soup = BeautifulSoup(html,'lxml')
    
    #注意以下注释的是不同的方法或定位,都可以
    
    #divs = soup.find_all('div',class_="article block untagged mb15")
    
    #divs = soup.select('div .article.block.untagged.mb15') # 注意这里 class属性中有空格,都转为.
    
    divs = soup.select('div.col1 > div')  # 这里是用从一层标签开始定位的。
    
    for div in divs:
    
        author =  div.select('div > a > img')
        if author :
            print author[0]['alt']
    
    
        content =  div.select('a > div > span')[0].text
        print content
    
        funny =  div.select('div.stats > span.stats-vote > i')[0].text
        print funny
    
        comment =  div.select('div.stats > span.stats-comments > a > i')[0].text
        print comment
    

    二、使用XPath

    # coding=utf-8
    import requests
    from lxml import etree
    
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
    headers={"User-Agent":user_agent}  #请求头,headers是一个字典类型
    
    html = requests.get('http://www.qiushibaike.com/text/',headers=headers).content
    
    selector = etree.HTML(html)
    
    divs = selector.xpath('//div[@class="article block untagged mb15"]')
    
    for div in divs:
        author = div.xpath('div[1]/a[2]/@title')
        print author[0]
    
        content = div.xpath('a[1]/div/span/text()[1]')
    
        print content[0]
    
        funny = div.xpath('div[2]/span[1]/i/text()')
    
        print funny[0]
    
        comment = div.xpath('div[2]/span[2]/a/i/text()')
    
        print comment[0]
    
    

    以上数据只作了打印显示。

    相关文章

      网友评论

      • 0b62d1ef2316:厉害厉害 叼叼叼叼 好好好好 棒棒棒棒

      本文标题:010 - 使用BeautifulSoup和XPath抓取结构化

      本文链接:https://www.haomeiwen.com/subject/hzwhtxtx.html