跳到主要内容

正则表达式和XPath

正则

在线测试正则的工具 语法教程

元字符

字符描述示例
[]一组字符"[a-m]"
\ 示意特殊序列(也可用于转义特殊字符)"\d"
.任何字符(换行符除外)"he..o"
^起始于(一行的起始)"^hello"
$结束于"world$"
?匹配 0 或 1 个正好在它之前的那个字符。要匹配 ? 字符,请使用 \?/[1-9][0-9]?/ 匹配 1~99 的正整数
*表示匹配 0-无穷(不存在的也匹配)"aix*"
+表示匹配 1-无穷(只匹配任意次存在的)"aix+"
{}确切地指定的出现次数"al{2}"
|两者任一"falls|stays"
()捕获和分组
* 和 + 的理解
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)


src=".*"
匹配结果是:src="test.jpg" width="60px" height="80px"
意思是从 =" 往后匹配,直到最后一个 " 匹配结束


懒惰模式正则:
src=".*?"
结果:src="test.jpg"
因为匹配到第一个 " 就结束了一次匹配,不会继续向后匹配。因为他懒惰嘛

特殊序列(特殊序列指的是 \ 后跟下表中的某个字符,拥有特殊含义)

字符描述示例
\A如果指定的字符位于字符串的开头,则返回匹配项"\AThe"
\b返回指定字符位于单词的开头或末尾的匹配项r"\bain" 或 r"ain\b"
\B返回指定字符存在的匹配项,但不在单词的开头(或结尾处)r"\Bain" 或 r"ain\B"
\d返回字符串包含数字的匹配项(数字 0-9)"\d"
\D返回字符串不包含数字的匹配项"\D"
\s返回字符串包含空白字符的匹配项"\s"
\S返回字符串不包含空白字符的匹配项"\S"
\w返回一个匹配项,其中字符串包含任何单词字符(从 a 到 Z 的字符,从 0 到 9 的数字和下划线 _ 字符)"\w"
\W返回一个匹配项,其中字符串不包含任何单词字符"\W"
\Z如果指定的字符位于字符串的末尾,则返回匹配项"Spain\Z"
集合描述
[arn]返回一个匹配项,其中存在指定字符(a,r 或 n)之一
[a-n]返回字母顺序 a 和 n 之间的任意小写字符匹配项
arn返回除 a、r 和 n 之外的任意字符的匹配项
[0123]返回存在任何指定数字(0、1、2 或 3)的匹配项
[0-9]返回 0 与 9 之间任意数字的匹配
[0-5][0-9]返回介于 0 到 9 之间的任何数字的匹配项
[a-zA-Z]返回字母顺序 a 和 z 之间的任何字符的匹配,小写或大写
[+]在集合中,+、*、.、|、()、$、{} 没有特殊含义,因此 [+] 表示:返回字符串中任何 + 字符的匹配项

示例

[-+]? # 匹配正负


# 将 '\n 9.0' 转换成 9.0
# '\n 9.5' 转换成 9.5
[0-9].?[0-9]


# '饰:哈利·波特 Harry Potter' 转成 '哈利·波特 Harry Potter'
[^饰:].*


#\n 20世纪40年代末,小有成就的青年银行家安迪(蒂姆·罗宾斯 饰)因涉嫌杀害妻子及她的情人而
#锒铛入狱。在这座名为肖申克的监狱内,希望似乎虚无缥缈,终身监禁的惩罚无疑注定了安迪接下来灰暗绝望的人生。未过
#多久,安迪尝试接近囚犯中颇有声望的瑞德(摩根·弗里曼 饰),请求对方帮自己搞来小锤子。以此为契机,二人逐渐熟
#稔,安迪也仿佛在鱼龙混杂、罪恶横生、黑白混淆的牢狱中找到属于自己的求生之道。他利用自身的专业知识,帮助监狱管
#理层逃税、洗黑钱,同时凭借与瑞德的交往在犯人中间也渐渐受到礼遇。表面看来,他已如瑞德那样对那堵高墙从憎恨转变
#为处之泰然,但是对自由的渴望仍促使他朝着心中的希望和目标前进。而关于其罪行的真相,似乎更使这一切朝前推进了一
#步……\n
# 不匹配 \n
[^\\n\s].?[^\\n]*

XPath

XPath 主要是用来处理 XML 格式文档的

关键字

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。

例子

路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()< 3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
可以使用两个 []

例如://div[@class="m-v-sm info"][1]
表示符合 class="m-v-sm info" 属性的第一个元素

获取属性

//div[@class="aaaa"]//a/@href 
//div[@class="aaaa"]//img/@src

示例

def parse(self, response):
items = response.xpath('//div[@class="el-col el-col-18 el-col-offset-3"]//div[@class="el-row"]')
for it in items:
# 内循环遍历获取类型
categories = it.xpath('.//button/span/text()')
categoryList = []
for category in categories:
categoryList.append(category.get())
item = {
"图片地址": it.xpath('.//img/@src').get(),
"跳转地址": it.xpath('.//a[@class="name"]/@href').get(),
"名称": it.xpath('.//h2/text()').get(),
"类型": categoryList,
"国家": it.xpath('.//div[@class="m-v-sm info"][1]/span[1]/text()').get(),
"上映时间": it.xpath('.//div[@class="m-v-sm info"][2]/span[1]/text()').get(),
"时长": it.xpath('.//div[@class="m-v-sm info"][1]/span[3]/text()').get(),
"评分": it.xpath('.//p/text()').get(),
}
print(item)