主要学习内容:

  • Beautiful Soup库的入门
  • xpath的使用
  • re的使用

1. Beautiful Soup库入门

  • Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据。
  • 它基于HTML DOM 的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。
  • BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。
  • 虽然说BeautifulSoup4 简单容易比较上手,但是匹配效率还是远远不如正则以及xpath的,一般不推荐使用,推荐正则的使用

使用:

  • 第一步:pip install beautifulsoup4 ,万事开头难,先安装 beautifulsoup4,安装成功后就完成了第一步。
  • 第二步:导入from bs4 import BeautifulSoup
  • 第三步:创建 Beautiful Soup对象 soup = BeautifulSoup(html,‘html.parser’)

1.1 Beautiful Soup库的基本元素

  1. Beautiful Soup库的理解:
    Beautiful Soup库是解析、遍历、维护“标签树”的功能库,对应一个HTML/XML文档的全部内容

  2. BeautifulSoup类的基本元素:

    • Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾;
    • Name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name;
    • Attributes 标签的属性,字典形式组织,格式:<tag>.attrs;
    • NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string;
    • Comment 标签内字符串的注释部分,一种特殊的Comment类型;
# 导入bs4库
from bs4 import BeautifulSoup
import requests # 抓取页面r = requests.get('https://python123.io/ws/demo.html') # Demo网址
demo = r.text  # 抓取的数据
demo
'<html><head><title>This is a python demo page</title></head>\r\n<body>\r\n<p class="title"><b>The demo python introduces several python courses.</b></p>\r\n<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:\r\n<a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>\r\n</body></html>'
# 解析HTML页面
soup = BeautifulSoup(demo, 'html.parser')  # 抓取的页面数据;bs4的解析器
# 有层次感的输出解析后的HTML页面
print(soup.prettify())
'<html>\n <head>\n  <title>\n   This is a python demo page\n  </title>\n </head>\n <body>\n  <p class="title">\n   <b>\n    The demo python introduces several python courses.\n   </b>\n  </p>\n  <p class="course">\n   Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:\n   <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">\n    Basic Python\n   </a>\n   and\n   <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">\n    Advanced Python\n   </a>\n   .\n  </p>\n </body>\n</html>'

1)标签,用soup.访问获得:

  • 当HTML文档中存在多个相同对应内容时,soup.返回第一个
soup.a # 访问标签a
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
soup.title
<title>This is a python demo page</title>

2)标签的名字:每个都有自己的名字,通过soup..name获取,字符串类型

soup.a.name
'a'
soup.a.parent.name
'p'
soup.p.parent.name
'body'

3)标签的属性,一个可以有0或多个属性,字典类型,soup..attrs

tag = soup.a
print(tag.attrs)
print(tag.attrs['class'])
print(type(tag.attrs))
{'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
['py1']
<class 'dict'>

4)Attributes:标签内非属性字符串,格式:soup..string, NavigableString可以跨越多个层次

print(soup.a.string)
print(type(soup.a.string))
Basic Python
<class 'bs4.element.NavigableString'>

5)NavigableString:标签内字符串的注释部分,Comment是一种特殊类型(有–>)

print(type(soup.p.string))
<class 'bs4.element.NavigableString'>

6) .prettify()为HTML文本<>及其内容增加更加’\n’,有层次感的输出

.prettify()可用于标签,方法:<tag>.prettify()

print(soup.prettify())
<html><head><title>This is a python demo page</title></head><body><p class="title"><b>The demo python introduces several python courses.</b></p><p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>and<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p></body>
</html>
print(soup.a.prettify())
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python
</a>

7)bs4库将任何HTML输入都变成utf‐8编码

Python 3.x默认支持编码是utf‐8,解析无障碍

newsoup = BeautifulSoup('<a>中文</a>', 'html.parser')
print(newsoup.prettify())
<a>中文
</a>

1.2 基于bs4库的HTML内容遍历方法

HTML基本格式:<>…</>构成了所属关系,形成了标签的树形结构

  • 标签树的下行遍历

    • .contents 子节点的列表,将<tag>所有儿子节点存入列表
    • .children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
    • .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
  • 标签树的上行遍
    • .parent 节点的父亲标签
    • .parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
  • 标签树的平行遍历
    • .next_sibling 返回按照HTML文本顺序的下一个平行节点标签
    • .previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
    • .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
    • .previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
  • 详见:https://www.cnblogs.com/mengxiaoleng/p/11585754.html#_label0

标签树的下行遍历

import requests
from bs4 import BeautifulSoupr=requests.get('http://python123.io/ws/demo.html')
demo=r.text
soup=BeautifulSoup(demo,'html.parser')
print(soup.contents)# 获取整个标签树的儿子节点
[<html><head><title>This is a python demo page</title></head>
<body>
<p class="title"><b>The demo python introduces several python courses.</b></p>
<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>
</body></html>]
print(soup.body.content)#返回标签树的body标签下的节点
None
print(soup.head)#返回head标签
<head><title>This is a python demo page</title></head>
for child in soup.body.children:#遍历儿子节点print(child)
<p class="title"><b>The demo python introduces several python courses.</b></p><p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>
for child in soup.body.descendants:#遍历子孙节点print(child)
<p class="title"><b>The demo python introduces several python courses.</b></p>
<b>The demo python introduces several python courses.</b>
The demo python introduces several python courses.<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>
Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
Basic Pythonand
<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
Advanced Python
.

标签树的上行遍历

soup.title.parent
<head><title>This is a python demo page</title></head>
soup.title.parent
<head><title>This is a python demo page</title></head>
soup.parent
for parent in soup.a.parents: # 遍历先辈的信息if parent is None:print(parent)else:print(parent.name)
p
body
html
[document]

标签树的平行遍历

注意:

  • 标签树的平行遍历是有条件的
  • 平行遍历发生在同一个父亲节点的各节点之间
  • 标签中的内容也构成了节点
print(soup.a.next_sibling)#a标签的下一个标签
 and
print(soup.a.next_sibling.next_sibling)#a标签的下一个标签的下一个标签
<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
print(soup.a.previous_sibling)#a标签的前一个标签
Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
print(soup.a.previous_sibling.previous_sibling)#a标签的前一个标签的前一个标签
None
for sibling in soup.a.next_siblings:#遍历后续节点print(sibling)
 and
<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
.
for sibling in soup.a.previous_sibling:#遍历之前的节点print(sibling)

1.3 基于bs4库的HTML内容的查找方法

  • <>.find_all(name, attrs, recursive, string, **kwargs)

    参数 含义
    ∙name 对标签名称的检索字符串
    ∙attrs 对标签属性值的检索字符串,可标注属性检索
    ∙recursive 是否对子孙全部检索,默认True
    ∙string <>…</>中字符串区域的检索字符串
    • 简写:
    • <tag>(…) 等价于 <tag>.find_all(…)
    • soup(…) 等价于 soup.find_all(…)
  • 扩展方法:
    方法 含义
    <>.find() 搜索且只返回一个结果,同.find_all()参数
    <>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
    <>.find_parent() 在先辈节点中返回一个结果,同.find()参数
    <>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
    <>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
    <>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
    <>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数
import requests
from bs4 import BeautifulSoupr = requests.get('http://python123.io/ws/demo.html')
demo = r.text
soup = BeautifulSoup(demo,'html.parser')
soup
<html><head><title>This is a python demo page</title></head>
<body>
<p class="title"><b>The demo python introduces several python courses.</b></p>
<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>
</body></html>
# name : 对标签名称的检索字符串
soup.find_all('a')
[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>,<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
soup.find_all(['a', 'p'])
[<p class="title"><b>The demo python introduces several python courses.</b></p>,<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>,<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>,<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
# attrs: 对标签属性值的检索字符串,可标注属性检索
soup.find_all("p","course")
[<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> and <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>.</p>]
soup.find_all(id="link") # 完全匹配才能匹配到
[]
#  recursive: 是否对子孙全部检索,默认True
soup.find_all('p',recursive=False)
[]
# string: <>…</>中字符串区域的检索字符串
soup.find_all(string = "Basic Python") # 完全匹配才能匹配到
[]

1.4 实战:中国大学排名定向爬取

  • 爬取url:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html
  • 爬取思路:
    1. 从网络上获取大学排名网页内容
    2. 提取网页内容中信息到合适的数据结构(二维数组)-排名,学校名称,总分
    3. 利用数据结构展示并输出结果
# 导入库
import requests
from bs4 import BeautifulSoup
import bs4

1. 从网络上获取大学排名网页内容

def getHTMLText(url):try:r = requests.get(url)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return "爬取失败"

2. 提取网页内容中信息到合适的数据结构(二维数组)

  1. 查看网页源代码,观察并定位到需要爬取内容的标签;
  2. 使用bs4的查找方法提取所需信息-‘排名,学校名称,总分’
def fillUnivList(ulist, html):soup = BeautifulSoup(html, "html.parser")for tr in soup.find('tbody').children:if isinstance(tr, bs4.element.Tag):tds = tr('td')ulist.append([tds[0].string,tds[1].string,tds[3].string])

3. 利用数据结构展示并输出结果

def printUnivList(ulist, num):tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"print(tplt.format("排名","学校名称","总分",chr(12288)))for i in range(num):u = ulist[i]print(tplt.format(u[0],u[1],u[2],chr(12288)))
uinfo = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
html = getHTMLText(url)
fillUnivList(uinfo, html)
# 打印输出30个信息
printUnivList(uinfo, 30)
    排名          学校名称         总分    1            清华大学        94.6   2            北京大学        76.5   3            浙江大学        72.9   4           上海交通大学       72.1   5            复旦大学        65.6   6          中国科学技术大学      60.9   7           华中科技大学       58.9   7            南京大学        58.9   9            中山大学        58.2   10         哈尔滨工业大学       56.7   11         北京航空航天大学      56.3   12           武汉大学        56.2   13           同济大学        55.7   14          西安交通大学       55.0   15           四川大学        54.4   16          北京理工大学       54.0   17           东南大学        53.6   18           南开大学        52.8   19           天津大学        52.3   20          华南理工大学       52.0   21           中南大学        50.3   22          北京师范大学       49.7   23           山东大学        49.1   23           厦门大学        49.1   25           吉林大学        48.9   26          大连理工大学       48.6   27          电子科技大学       48.4   28           湖南大学        48.1   29           苏州大学        47.3   30          西北工业大学       46.7

2. 学习xpath

2.1 学习目标:

  1. 学习xpath,使用lxml+xpath提取内容。

  2. 使用xpath提取丁香园论坛的回复内容。

  • 抓取丁香园网页:http://www.dxy.cn/bbs/thread/626626#626626 。

2.2 Xpath常用的路径表达式:

  • XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
  • 在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
  • XML文档是被作为节点树来对待的。

XPath使用路径表达式在XML文档中选取节点。节点是通过沿着路径选取的。下面列出了最常用的路径表达式:

  • nodename 选取此节点的所有子节点。

  • / 从根节点选取。

  • // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

  • . 选取当前节点。

  • … 选取当前节点的父节点。

  • @ 选取属性。

  • /text() 提取标签下面的文本内容

    • 如:
    • /标签名 逐层提取
    • /标签名 提取所有名为<>的标签
    • //标签名[@属性=“属性值”] 提取包含属性为属性值的标签
    • @属性名 代表取某个属性名的属性值
  • 详细学习:https://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html

2.3 使用lxml解析

  • 导入库:from lxml import etree

  • lxml将html文本转成xml对象

    • tree = etree.HTML(html)
  • 用户名称:tree.xpath(’//div[@class=“auth”]/a/text()’)

  • 回复内容:tree.xpath(’//td[@class=“postbody”]’) 因为回复内容中有换行等标签,所以需要用string()来获取数据。

    • string()的详细见链接:https://www.cnblogs.com/CYHISTW/p/12312570.html
  • Xpath中text(),string(),data()的区别如下:

    • text()仅仅返回所指元素的文本内容。
    • string()函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。
    • data()大多数时候,data()函数和string()函数通用,而且不建议经常使用data()函数,有数据表明,该函数会影响XPath的性能。

2.4 实战:爬取丁香园-用户名和回复内容

  • 爬取思路:

    1. 获取url的html
    2. lxml解析html
    3. 利用Xpath表达式获取user和content
    4. 保存爬取的内容
# 导入库
from lxml import etree
import requestsurl = "http://www.dxy.cn/bbs/thread/626626#626626"

1. 获取url的html

req = requests.get(url)
html = req.text
# html

2. lxml解析html

tree = etree.HTML(html)
tree
<Element html at 0x21331c9f088>

3. 利用Xpath表达式获取user和content(重点)

user = tree.xpath('//div[@class="auth"]/a/text()')
# print(user)
content = tree.xpath('//td[@class="postbody"]')

4. 保存爬取的内容

results = []
for i in range(0, len(user)):# print(user[i].strip()+":"+content[i].xpath('string(.)').strip())# print("*"*80)# 因为回复内容中有换行等标签,所以需要用string()来获取数据results.append(user[i].strip() + ":  " + content[i].xpath('string(.)').strip())
# 打印爬取的结果
for i,result in zip(range(0, len(user)),results):print("user"+ str(i+1) + "-" + result)print("*"*100)
user1-楼医生:  我遇到一个“怪”病人,向大家请教。她,42岁。反复惊吓后晕厥30余年。每次受响声惊吓后发生跌倒,短暂意识丧失。无逆行性遗忘,无抽搐,无口吐白沫,无大小便失禁。多次跌倒致外伤。婴儿时有惊厥史。入院查体无殊。ECG、24小时动态心电图无殊;头颅MRI示小软化灶;脑电图无殊。入院后有数次类似发作。请问该患者该做何诊断,还需做什么检查,治疗方案怎样?
****************************************************************************************************
user2-lion000:  从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”作者:林文华 任自文 丁燕生http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm
****************************************************************************************************
user3-xghrh:  同意lion000版主的观点:如果此患者随着年龄的增长,其发作频率逐渐减少且更加支持,不知此患者有无这一特点。入院后的HOLTER及血压监测对此患者只能是一种安慰性的检查,因在这些检查过程中患者发病的机会不是太大,当然不排除正好发作的情况。对此患者应常规作直立倾斜试验,如果没有诱发出,再考虑有无可能是其他原因所致的意识障碍,如室性心动过速等,但这需要电生理尤其是心腔内电生理的检查,毕竟是有一种创伤性方法。因在外地,下面一篇文章可能对您有助,请您自己查找一下。心理应激事件诱发血管迷走性晕厥1例 ,杨峻青、吴沃栋、张瑞云,中国神经精神疾病杂志, 2002 Vol.28 No.2
****************************************************************************************************
user4-keys:  该例不排除精神因素导致的,因为每次均在受惊吓后出现。当然,在作出此诊断前,应完善相关检查,如头颅MIR(MRA),直立倾斜试验等。
****************************************************************************************************

3 学习正则表达式 re

3.1 为什么使用正则表达式?

典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。

通过使用正则表达式,可以:

- 测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
- 替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
- 基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本。

可以使用正则表达式来搜索和替换标记。

使用正则表达式的优势是什么? 简洁

  • 正则表达式是用来简洁表达一组字符串的表达式
  • 正则表达式是一种通用的字符串表达框架
  • 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具
  • 正则表达式可以用来判断某字符串的特征归属

正则表达式在文本处理中十分常用:

  • 同时查找或替换一组字符串
  • 匹配字符串的全部或部分(主要)

3.2 正则表达式语法

正则表达式语法由字符和操作符构成:

  • 常用操作符

    操作符 含义
    . 表示任何单个字符
    [ ] 字符集,对单个字符给出取值范围 ,如[abc]表示a、b、c,[a‐z]表示a到z单个字符
    [^ ] 非字符集,对单个字符给出排除范围 ,如[^abc]表示非a或b或c的单个字符
    * 前一个字符0次或无限次扩展,如abc* 表示 ab、abc、abcc、abccc等
    + 前一个字符1次或无限次扩展 ,如abc+ 表示 abc、abcc、abccc等
    ? 前一个字符0次或1次扩展 ,如abc? 表示 ab、abc
    | 左右表达式任意一个 ,如abc|def 表示 abc、def
    {m} 扩展前一个字符m次 ,如ab{2}c表示abbc
    {m,n} 扩展前一个字符m至n次(含n) ,如ab{1,2}c表示abc、abbc
    ^ 匹配字符串开头 ,如^abc表示abc且在一个字符串的开头
    $ 匹配字符串结尾 ,如abc$表示abc且在一个字符串的结尾
    ( ) 分组标记,内部只能使用 | 操作符 ,如(abc)表示abc,(abc|def)表示abc、def
    \d 数字,等价于[0‐9]
    \w 单词字符,等价于[A‐Za‐z0‐9_]

3.3 正则表达式re库的使用

  • 调用方式:import re
  • re库采用raw string类型表示正则表达式,表示为:r’text’,raw string是不包含对转义符再次转义的字符串;

re库的主要功能函数:

  • re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象

    • re.search(pattern, string, flags=0)
  • re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
    • re.match(pattern, string, flags=0)
  • re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
    • re.findall(pattern, string, flags=0)
  • re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
    • re.split(pattern, string, maxsplit=0, flags=0)
  • re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
    • re.finditer(pattern, string, flags=0)
  • re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
    • re.sub(pattern, repl, string, count=0, flags=0)

    • flags : 正则表达式使用时的控制标记:

      • re.I --> re.IGNORECASE : 忽略正则表达式的大小写,[A‐Z]能够匹配小写字符
      • re.M --> re.MULTILINE : 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
      • re.S --> re.DOTALL : 正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符

re库的另一种等价用法(编译)

  • regex = re.compile(pattern, flags=0):将正则表达式的字符串形式编译成正则表达式对象

re 库的贪婪匹配和最小匹配

  • .* Re库默认采用贪婪匹配,即输出匹配最长的子串
  • *? 只要长度输出可能不同的,都可以通过在操作符后增加?变成最小匹配

3.4 实战:淘宝商品比价定向爬虫

  • 爬取网址:https://s.taobao.com/search?q=书包&js=1&stats_click=search_radio_all%25
  • 爬取思路:
    1. 提交商品搜索请求,循环获取页面
    2. 对于每个页面,提取商品名称和价格信息
    3. 将信息输出到屏幕上
# 导入包
import requests
import re

1. 提交商品搜索请求,循环获取页面

def getHTMLText(url):"""请求获取html,(字符串):param url: 爬取网址:return: 字符串"""try:# 添加头信息,kv = {'cookie': 'thw=cn; v=0; t=ab66dffdedcb481f77fd563809639584; cookie2=1f14e41c704ef58f8b66ff509d0d122e; _tb_token_=5e6bed8635536; cna=fGOnFZvieDECAXWIVi96eKju; unb=1864721683; sg=%E4%B8%8B3f; _l_g_=Ug%3D%3D; skt=83871ef3b7a49a0f; cookie1=BqeGegkL%2BLUif2jpoUcc6t6Ogy0RFtJuYXR4VHB7W0A%3D; csg=3f233d33; uc3=vt3=F8dBy3%2F50cpZbAursCI%3D&id2=UondEBnuqeCnfA%3D%3D&nk2=u%2F5wdRaOPk21wDx%2F&lg2=VFC%2FuZ9ayeYq2g%3D%3D; existShop=MTU2MjUyMzkyMw%3D%3D; tracknick=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; lgc=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; _cc_=WqG3DMC9EA%3D%3D; dnk=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; _nk_=%5Cu4E36%5Cu541B%5Cu4E34%5Cu4E3F%5Cu5929%5Cu4E0B; cookie17=UondEBnuqeCnfA%3D%3D; tg=0; enc=2GbbFv3joWCJmxVZNFLPuxUUDA7QTpES2D5NF0D6T1EIvSUqKbx15CNrsn7nR9g%2Fz8gPUYbZEI95bhHG8M9pwA%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=32_1; alitrackid=www.taobao.com; lastalitrackid=www.taobao.com; swfstore=97213; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; uc1=cookie16=UtASsssmPlP%2Ff1IHDsDaPRu%2BPw%3D%3D&cookie21=UIHiLt3xThH8t7YQouiW&cookie15=URm48syIIVrSKA%3D%3D&existShop=false&pas=0&cookie14=UoTaGqj%2FcX1yKw%3D%3D&tag=8&lng=zh_CN; JSESSIONID=A502D8EDDCE7B58F15F170380A767027; isg=BMnJJFqj8FrUHowu4yKyNXcd2PXjvpa98f4aQWs-RbDvsunEs2bNGLfj8BYE6lWA; l=cBTDZx2mqxnxDRr0BOCanurza77OSIRYYuPzaNbMi_5dd6T114_OkmrjfF96VjWdO2LB4G2npwJ9-etkZ1QoqpJRWkvP.; whl=-1%260%260%261562528831082','user-agent': 'Mozilla/5.0'}r = requests.get(url, timeout=30, headers=kv)# r = requests.get(url, timeout=30)# print(r.status_code)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return "爬取失败"

2. 对于每个页面,提取商品名称和价格信息(完成正则表达式语句)

def parsePage(glist, html):'''解析网页,搜索需要的信息:param glist: 列表作为存储容器:param html: 由getHTMLText()得到的:return: 商品信息的列表'''try:# 使用正则表达式提取信息#商品价格price_list = re.findall(r'"view_price":".*?"', html)#商品名称name_list = re.findall(r'"raw_title":".*?"', html)for i in range(len(price_list)):price = eval(price_list[i].split(":")[1])  #eval()在此可以去掉""name = eval(name_list[i].split(":")[1])glist.append([price, name])except:print("解析失败")

3. 将信息输出到屏幕上

def printGoodList(glist):tplt = "{0:^4}\t{1:^6}\t{2:^10}"print(tplt.format("序号", "商品价格", "商品名称"))count = 0for g in glist:count = count + 1print(tplt.format(count, g[0], g[1]))
# 根据页面url的变化寻找规律,构建爬取url
goods_name = "书包"  # 搜索商品类型
start_url = "https://s.taobao.com/search?q=" + goods_name
info_list = []
page = 3  # 爬取页面数量
count = 0
for i in range(page):count += 1try:url = start_url + "&s=" + str(44 * i)html = getHTMLText(url)  # 爬取urlparsePage(info_list, html) #解析HTML和爬取内容print("\r爬取页面当前进度: {:.2f}%".format(count * 100 / page), end="")  # 显示进度条except:continue
爬取页面当前进度: 100.00%
printGoodList(info_list)
 序号   商品价格      商品名称   1     138.00  电脑包大书包大学生女生背包大双肩包大容量2   59.00   双肩包男士大容量旅行电脑背包时尚潮流高中初中学生书包女大学生3     149.00  鳄鱼男士双肩包商务休闲电脑帆布背包旅游旅行包时尚潮流学生书包4     59.80   商务背包男士双肩包韩版潮流旅行休闲女中学生书包简约时尚电脑包5     279.00  Jordan 官方 AIR JORDAN 双肩包 书包背包CW76996    669.00  kipling女士帆布背包2020年新款时尚简约休闲潮流书包双肩包|ROSE7     175.00  不莱玫迪士尼合作款书包女韩版高中百搭ins双肩包时尚可爱小背包8    79.00   妈妈包多功能大容量双肩背包女高中学生书包休闲韩版潮母婴包旅行9     689.00  背包双肩包男士商务旅行背包防盗电脑包休闲书包男多功能大旅游包10    175.00  不莱玫迪士尼米奇双肩包新款韩版高中复古背包大容量学生帆布书包11    358.00  JanSport旗舰店官网女双肩背包学生书包电脑包男背包 3P6X00812  149.00  花花公子男士背包2020年新款商务电脑双肩包高中学生大容量书包13   998.00  Herschel Little America经典色旅游双肩包男女士背包书包1002014   899.00  【买1送1】Fion/菲安妮大牌双肩包女 2020新款印花背包旅行书包15   288.00  【新品】JanSport杰斯伯双肩包女大学生书包男休闲背包4QUT04S16  1098.00 Herschel Dawson大号时尚双肩包 Surplus系列休闲背包书包1064917   479.00  Fjallraven/瑞典北极狐双肩包kanken书包女电脑旅行背包官方2351018     428.00  Teenmix/天美意2020春新款商场同款外出纯色校园双肩书包X1900AX019  299.00  Viney真皮双肩包2020年新款韩版百搭书包韩版原宿ulzzang双肩背包20    139.00  阿迪达斯双肩背包男包女包2020夏季新款运动电脑包学生书包FQ526121   189.00  阿迪达斯双肩包男女2020新款初中生高中学生书包大容量背包DT863822   255.00  Viney双肩包包2020新款潮真皮时尚背包女大容量书包韩版百搭女包23    129.00  uek小学生书包男孩女生一三五 六年级护脊双肩6-12岁轻便减压儿童24    199.00  瑞士军士刀双肩包男大容量休闲商务旅行电脑背包男士初中学生书包25    289.00  阿迪达斯双肩包男包女包学生书包20新款旅行包休闲简约背包DQ106626    498.00  Tiger Family护脊减负书包 小学生3-5年级儿童女12周岁男童背包27    299.00  【直营】Adidas双肩包男女CL AOP运动休闲舒适学生书包背包FM689628   139.00  牛津布双肩包女2020新款韩版时尚百搭简约旅行防盗背包帆布书包潮29  149.00  特步男女双肩包2020春季新款综训背包舒适简约纯色书包男运动背包30  970.00  Gaston Luga瑞典潮牌背包男双肩包女大容量旅行包休闲书包电脑包31   178.00  迪士尼小学生书包女童1-3-4一三年级冰雪奇缘女孩减负儿童双肩包632     438.00  tigerfamily小学生书包1-3年级男女孩儿童书包减负护脊背包6周岁33     129.00  Skechers斯凯奇2020春夏青少年男女童实用休闲双肩包书包L120K04834  159.00  稻草人双肩包女 2020新款书包韩版高中原宿ulzzang格子休闲旅游包35  69.90   大脸兔牛津布双肩包女2020新款韩版尼龙百搭旅行防水超轻背包书包36  239.00  Hype黑白格子双肩包女背包简约百搭ins风潮牌韩版高中大学生书包37     79.00   电脑包男双肩包商务笔记本背包男士大容量15.6寸旅行出差休闲书包38  409.00  初弎牛仔善恶 学生书包街头潮流男女时尚休闲双肩包男士背包4141339     869.00  kipling男女大容量电脑包2020新款时尚书包旅行包双肩包|SO BABY40   149.00  PUMA彪马官网正品男女双肩包2020新款学生书包旅游包休闲运动背包41    115.00  kk树书包小学生女孩6-12岁儿童一二三到六年级女童双肩包护脊减负42     419.00  Fjallraven/北极狐双肩包kanken mini 迷你情侣书包背包女2356143   219.00  PUMA彪马双肩包男包女包2019新款运动包休闲背包学生书包07470644  199.00  PUMA彪马官网正品双肩包男包女包2020春季新款运动包学生书包背包45    188.00  优仅ALLJOINT儿童书包可爱幼儿园双肩甜甜圈彩虹幼儿背包女童包包46    499.00  日本进口卡芙露书包小学生1-3年级6儿童轻便减负护脊男女双肩背包47  59.90   森马双肩包女大学生轻便简约书包韩版高中休闲旅行背包男时尚潮流48    389.00  朱丹推荐诺狐书包小学生女孩一二三到六年级护脊减负儿童双肩背包49    119.90  森马背包男双肩包休闲简约潮流旅行包女大容量电脑包书包50    104.90  森马双肩包女休闲简约尼龙背包大学生古着感书包韩版高中51    104.90  森马双肩包女旅行包休闲简约学生校园背包书包男52    79.90   森马双肩包女新款简约小清新旅行包背包男韩版时尚校园学生书包女53    29.90   森马双肩包女新款户外旅游轻便迷你书包大学生休闲简约女背包54  134.90  森马双肩包男大容量背包15.6寸休闲电脑包高中学生书包女时尚潮流55  119.90  森马双肩包女新款简约休闲韩版背包男大容量书包大学生56     104.90  森马双肩包女小休闲简约尼龙背包大学生古着感ins风书包韩版百搭57   99.90   森马双肩包女日系休闲校园背包大容量学生书包离家出走包58    104.90  森马双肩包男拼接简约休闲大学生校园书包旅行包电脑包59     59.90   森马双肩包女新款韩版大学生简约书包旅游休闲背包男时尚潮流60  79.90   森马双肩包女韩版简约旅行背包中学生大容量高中书包男 时尚潮流61    99.90   森马双肩包男新款简约休闲背包女时尚潮流韩版书包中学生 初中生62    59.90   迪卡侬双肩包女男休闲旅行牛仔蓝学生初中生书包背包电脑包feel63   19.90   迪卡侬旗舰店2020新款双肩包男女书包旅行包运动小背包轻便包QUBP64    79.90   迪卡侬运动双肩包电脑背包书包男女健身包旅行包休闲商务KIPT65    269.90  迪卡侬防水双肩包旅行休闲包书包运动背包男女潜水户外骑行ITIWIT66     14.90   迪卡侬旗舰店儿童双肩包书包男学生包户外休闲背包女双肩背包QUJR67  49.90   迪卡侬旗舰店儿童运动背包男女青少年登山包双肩包学生书包QUJR68   99.90   迪卡侬旗舰店登山包运动背包骑行户外徒步书包男双肩包女20L SOL69     99.90   迪卡侬旗舰店运动背包男书包女健身篮球旅行足球高中大容量包KIPT70  49.90   迪卡侬官网新款户外双肩包登山旅行包男书包学生休闲女背包QUBP71   14.90   迪卡侬儿童小书包双肩包男女童旅行休闲背包运动包双肩背包QUJR72   19.90   迪卡侬旗舰店双肩包背包男健身包运动儿童学生团购书包旅行包KIPT73  99.90   迪卡侬旗舰店双肩包户外登山包背包男旅行女大容量轻便书包QUBP74   99.90   迪卡侬户外双肩背包男女休闲双肩包运动学生小书包轻便10L QUBP75     299.90  迪卡侬自行车户外骑行电脑水袋双肩旅游登山户外背负书包RR76  299.90  迪卡侬休闲旅行包出差大容量户外防雨罩男女书包登山包双肩包FOR377  79.00   美特斯邦威双肩包男女夏季新款时尚潮流书包多色休闲情侣款旅行包78    428.00  Herschel Nova 时尚潮流书包校园双肩包女迷小包背包百搭1050179    528.00  Herschel Classic 超大号旅游时尚潮流双肩背包男女书包1049280   598.00  Herschel Dawson 旅游双肩包男士背包书包女1023381     698.00  Herschel Athletics系列 Kaine 时尚休闲双肩包 背包 书包1069682     998.00  Herschel Little America经典色旅游双肩包男女士背包书包1002083   348.00  Herschel Classic Pro 限量款双肩包男女背包书包大容量1055984     498.00  Herschel City中号校园双肩包男书包背包潮牌女 ins 百搭1048685  498.00  Herschel Heritage 3-4岁儿童双肩包背包 潮流书包1031386   598.00  Herschel Pop Quiz 时尚潮流双肩包男女背包书包大容量1001187   998.00  Herschel Buckingham 双肩包 休闲背包 大容量潮包 书包男1050988   528.00  Herschel Nova小号时尚潮流校园双肩包女小包书包背包百搭1050289    628.00  Herschel Nova中号旅游双肩包女2019新款学生背包书包ins1050390     448.00  Herschel Retreat 时尚潮流旅游男女双肩包书包背包百搭1006691   498.00  Herschel Heritage 时尚双肩包男 背包潮流时尚书包可爱1000792  698.00  Herschel Retreat经典色时尚潮流男女双肩包书包背包潮牌1006693   149.00  华为旗下荣耀亲选双肩包书包背包男女学生商务大学生大容量防水94     599.00  Fion/菲安妮时尚潮流双肩包女 小怪兽可爱学生书包简约女士小背包95     149.00  PUMA彪马双肩包2020夏季新款马卡龙初中高中学生书包运动包背包潮96    229.00  朱尔防盗双肩包女2020新款时尚牛津布女士背包百搭书包帆布女包包97  79.00   男士初中学生书包时尚潮流大容量双肩包高中大学生休闲旅行背包男98    103.50  瑞士军刀双肩包男背包休闲商务旅行大容量瑞士书包高中生电脑男士99    798.00  Samsonite/新秀丽儿童书包小学生男孩女孩儿童轻便双肩背包  HB5
100     798.00  ito双肩包男商务设计师电脑包女皮质背包书包ins韩版原宿ulzzang
101     219.00  NIKE耐克双肩包男包女包官网旗舰高中初中运动包学生书包旅行背包
102     408.00  李宁CF溯系列双肩包敦煌拓男包女包2020新款学生书包运动包
103     299.00  BOPAI博牌双肩包男商务休闲简约大容量背包时尚书包15.6寸电脑包
104     169.00  小米 米兔儿童书包 6-12岁男女小学生潮双肩背包幼儿园大容量背包
105     89.00   双肩包女2020新款包包时尚百搭防盗大容量旅行背包大学生书包ins
106     209.00  EVB新款双肩包女韩版潮电脑背包旅行运动初高中小大学生书包男
107     199.00  小米双肩包商务旅行背包大容量书包男士时尚多功能笔记本电脑包
108     239.00  Skechers斯凯奇男女同款双肩背包书包LOGO刺绣运动休闲包L120U021
109     59.80   儿童书包小学生男女一二三到六年级韩版减负护脊贵族书包轻便防水
110     139.00  瑞士军士刀双肩包男大容量瑞士军刀旅行电脑背包男士初中学生书包
111     59.90   双肩包男背包女韩版休闲大容量旅行包高初中学生书包男时尚潮流
112     69.90   双肩包男背包韩版潮高中学生书包女校园大容量旅行休闲商务电脑包
113     598.00  Herschel Dawson 双肩包男书包女ins风潮牌街头背包欧美10233
114     998.00  Herschel Little America 春夏新色双肩包男背包书包潮流10014
115     698.00  kipling男女款大容量轻便帆布包简约复古休闲潮书包双肩包|MICAH
116     889.00  kipling男女大容量电脑背包2020年新款时尚书包旅行双肩包|SEOUL
117     258.00  JanSport旗舰店官网杰斯伯双肩包女学生书包纯色男士女士背包T501
118     98.00   迪士尼小学生书包女童1-3-4三四年级冰雪奇缘女孩儿童减负双肩包6
119     78.00   凯蒂猫书包小学生女童一二三六年级女孩减负轻便儿童休闲双肩背包
120     288.00  JanSport杰斯伯旗舰店双肩包女电脑包男书包学生休闲包47LW79M
121     115.00  kk树书包小学生男孩1-3-4-5年级儿童背包女孩6-12周岁双肩包护脊
122     219.00  NIKE耐克双肩包男包女包2020春季新款户外运动包学生书包旅行背包
123     332.00  迪士尼商店 唐老鸭85周年背包超萌可爱双肩包儿童书包小学生背包
124     299.00  CHARLES&KEITH 情书包 CK2-80840173-1朋克粗链条翻盖单肩包女
125     76.00   儿童书包小学生女一二三到六年级韩版减负护脊男孩轻便防水书包
126     89.00   书包女韩版高中运动风双肩包大容量中学生大学生简约背包休闲旅行
127     799.00  FION菲安妮双肩包女潮流女式旅行包 时尚书包防水女士背包妈妈包
128     118.00  可优比儿童背包防走丢失带包宝宝书包1-3岁幼儿园书包男女童包包
129     229.00  NIKE耐克双肩包2020新款男包女包高中大学生书包大容量运动包背包
130     89.00   双肩包女书包韩版原宿ulzzang中学生初中生高中大容量大学生背包
131     289.00  uek儿童书包女小学生一二年级轻便女孩四五年级可爱女生双肩背包
132     109.00  babycare宝宝入园书包婴 幼儿园小书包3岁男女儿童防走失背包可爱
133     129.00  阿迪达斯男包女包学生书包2020春季新款休闲旅行包双肩背包FJ9267
134     86.00   迪士尼书包男小学生1-3-6三到六4年级儿童双肩护脊减负轻便背包女
135     178.00  书包ins韩版原宿ulzzang初中高中大学生百搭森系背包网红双肩包女
136     139.00  花花公子男士双肩包时尚潮流个性大学生书包休闲旅行电脑迷彩背包

Python爬虫编程实践--task02相关推荐

  1. Python爬虫编程实践 Task02

    文章目录 一.Xpath Xpath常用的路径表达式 使用lxml解析 实战:爬取丁香园-用户名和回复内容 二.正则表达式 re库 正则表达式的语法 正则表达式re库的使用 re库的主要功能函数 re ...

  2. Python爬虫编程实践 Task03

    文章目录 IP代理 获取代理IP地址的方法 代码实现 selenium session 和 cookie 动态网页和静态网页 静态网页 动态网页 session和cookies session coo ...

  3. Python爬虫编程实践Task 01

    文章目录 1.互联网.HTTP 互联网 HTTP 2.开发者工具 3.request库 request.get request.post request.get进阶:爬取豆瓣电影 1.互联网.HTTP ...

  4. Python爬虫编程实践--task01

    主要内容 HTTP基础 HTML基础 requests.get的使用 API的使用 HTTP HTTP是一个客户端(用户)和服务器端(网站)之间进行请求和应答的标准.通过使用网页浏览器.网络爬虫或者其 ...

  5. Datawhale第十二期组队学习--Python爬虫编程实践 Task03:session和cookie、代理、selenium自动化 拔高:丁香园留言板爬取

    一. session和cookie 常用的 web 容器有 Nginx . Apache . Tomcat .Weblogic . Jboss . Resin 等等 http 1.0 HTTP1.0的 ...

  6. Python爬虫编程实践 Task04

    爬取腾讯新闻 了解ajax加载 通过chrome的开发者工具,监控网络请求,并分析 用selenium完成爬虫 具体流程如下: 用selenium爬取https://news.qq.com/ 的热点精 ...

  7. Python爬虫编程常见问题解决方法

    Python爬虫编程常见问题解决方法 参考文章: (1)Python爬虫编程常见问题解决方法 (2)https://www.cnblogs.com/xpwi/p/9604015.html (3)htt ...

  8. Python爬虫编程思想(6):实战案例:抓取所有的网络资源

    Python爬虫编程思想(7):实战案例:抓取博客文章列表 到现在为止,我们已经对网络爬虫涉及到的基本知识有了一个初步的了解.本文会编写一个简单的爬虫应用,以便让读者对爬虫有一个基本的认识.本节要编写 ...

  9. Python游戏编程实践2:魔塔

    Python游戏编程实践2:魔塔 前言 运行 前言 在逗游游戏盒上玩了一个名叫<魔塔>的游戏,感觉颇有心得体会."与其临渊羡鱼,不如退而结网",使用Python语言编写 ...

最新文章

  1. 《社会智能与综合集成系统》第1章1.节参考文献
  2. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
  3. 关于 SAP 电商云 Spartacus UI 访问 b2b site 的权限问题
  4. python能不能自动写代码_微软最强 Python 自动化工具开源了!不用写一行代码
  5. 无接触式智能服务 用“减法”重塑企业前台场景
  6. checked jq 添加_jquery动态添加复选框.attr(“checked”,true)不起作用
  7. 多程序集版本冲突问题
  8. 信息系统综合知识六 标准化与知识产权
  9. AT指令集超详细解析(内含EC20模块datasheet)
  10. 移植LLDP协议到mips架构设备
  11. 轩辕剑【超越XISE菜刀的shell管理工具】
  12. ssh登录极路由后台_OpenWrt刷机详细流程(极路由)
  13. 工欲善其事,必先利其器篇-高效实现右滑退出功能
  14. Android 拍照、选择图片并裁剪
  15. 北京周末去随便走走,体察千百年古城残存的
  16. 基于OBS超低延迟直播实测(400毫秒左右)超多组图
  17. 腾讯qq企业邮箱登录入口界面如何设置
  18. 四十九、HBase介绍
  19. 前端学习 之 CSS(三)
  20. 约束多目标优化 约束多目标进化/演化算法入门论文文献推荐 大部分论文代码已开源

热门文章

  1. 如何在Linux云服务器上搭建Xampp
  2. 《面向对象程序设计(Java)》期中考试试卷
  3. c#实现猜数游戏(do-while和for循环实现方法)
  4. iOS_11_tableViewCell的使用alertView修改数据
  5. MusicBrainz Picard for Mac(跨平台音乐标记器)
  6. ubuntu 系统安装与问题汇总
  7. hugeng007_demo03_
  8. 电磁原理---发电机
  9. 合肥学计算机的大学,合肥有哪些计算机的大学排名
  10. 离线部署PaddleOCR