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

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

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

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

《010 - 使用BeautifulSoup和XPath抓取结构化数据》

抓取数据字段:

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

选取的循环点放在这个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]

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

点赞