爬虫练手——使用Beautiful Soup、XPath分别获取丁香园论坛回复内容
简单整点吧
简单的说,Beautiful Soup就是Python的一个html或xml的解析库,可以用来从网页中提取数据。
BeautifulSoup在解析时实际上以来解析器,它除了支持Python标准库中的html解析器外,还支持一些第三方解析器(比如lxml)。用法介绍就看文档和一些书籍就好了,推荐崔庆才的《 Python3网络爬虫开发实战》。
再说说XPath,全称是XML Path Language,XMl路径语言,是一门在XML文当中查找信息的语言。它最初是用来搜索XML文档的,不过同样适用于HTML文档的搜索。Xpath的选择功能十分强大,提供了非常简洁的路径选择表达式。另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等等,几乎所有想要定位的节点都可以用XPath来选择。
XPath常用规则
表达式 | 描 述 |
---|---|
nodename | 选择此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
· | 选取当前节点 |
. . | 选取当前节点的父节点 |
@ | 选取属性 |
爬取丁香园论坛回复内容
如往常一样,打开浏览器,打开pycharm新建一个py文件,在浏览器地址栏输入目标网址:http://www.dxy.cn/bbs/thread/626626#626626 ,按F12进入开发者工具查看一下源代码,找到要获取的内容标签。
使用BeautifulSoup获取内容
源码
from bs4 import BeautifulSoup
import requests
url = 'http://www.dxy.cn/bbs/thread/626626#626626'
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html,'lxml')
#print(soup.title)
for data in soup.find_all('tbody'):
try:
username = data.find('div',class_= 'auth').get_text(strip=True)
content = data.find('td',class_='postbody').get_text(strip=True)
print(username+':'+content)
except:
pass
使用XPath获取内容
import requests
from lxml import etree
url = 'http://www.dxy.cn/bbs/thread/626626#626626'
response = requests.get(url)
html = response.text
ree = etree.HTML(html)
username = ree.xpath('//div[@class="auth"]/a/text()')
#print(username)
content = ree.xpath('//td[@class="postbody"]')
result = []
for i in range(len(username)):
result.append(username[i].strip()+':'+content[i].xpath('string(.)').strip())
print(result)