爬虫关于非规则html处理

来源:互联网 发布:天天饮食软件说明 编辑:程序博客网 时间:2024/06/05 10:38
html = r'''<div class=\"pagin pagin-m\"><span class=\"text\"><i>1</i>/25</span>        <a href=\"?cat=670%2C671%2C672&        page=1\" class=\"prev\">上一页<b></b></a><a href=\"?        cat=670%2C671%2C672&page=2\" class=\"next\">下一页<b></b></a></div>'''

html为网页中解析出的一个div标签,需注意html双引号前的反斜杠转义符。html中r''''''表示了原始字符,此处若不用r'', 执行print操作是,会将反斜杠作为转义符处理。即:

<div class="pagin pagin-m"><span class="text"><i>1</i>/25</span>        <a href="?cat=670%2C671%2C672&        page=1" class="prev">上一页<b></b></a><a href="?        cat=670%2C671%2C672&page=2" class="next">下一页<b></b></a></div>
raw功能也就是让反斜杠失去转义功能

由于正则表达式使用反斜杠来转义特殊字符, 而python自身处理字符时,反斜杠也是用于转义,这里就产生了一个双重转换的问题。

第一重转换为字符串自身的转义,普通非原始字符串中'\\'(两个反斜杠)事实上只是一个反斜杠,第一个会被python当做转义字符来处理,倘若把‘\\’作为pattern传入re模块则会报错,因为单个反斜杠‘\’在python正则中同样也是用来转义的,也就是说,re.compile('\\')的写法是错误的,它等价于:re.compile(r'\')

第二重转义正则中的转换了,python正则中反斜杠是作为转义字符存在的,不再有raw字符串的说法了,如果要表示反斜杠只能是re.compile(r'\\'),第一个用来转义表明第二个反斜杠是元字符。

这里用两种方法来匹配出html的页码25

html = r'''<div class=\"pagin pagin-m\"><span class=\"text\"><i>1</i>/25</span>        <a href=\"?cat=670%2C671%2C672&        page=1\" class=\"prev\">上一页<b></b></a><a href=\"?        cat=670%2C671%2C672&page=2\" class=\"next\">下一页<b></b></a></div>'''match = re.search('''<div class=\\\\"pagin pagin-m\\\\">.*/(\d+)</span>''', html)if match:    print match.group(1)else:    print match
注意此处的re.search()并没有使用raw原始字符串,所以字符串中的四个反斜杠才被正则解析后就是一个了,字符串中的‘\\\\’,传到正则中时就变成了‘\\’,而正则中的这两个反斜杠第一个也被用来转义了。

输出为25

*****************************************************

re.search()使用raw字符串

html = r'''<div class=\"pagin pagin-m\"><span class=\"text\"><i>1</i>/25</span>        <a href=\"?cat=670%2C671%2C672&        page=1\" class=\"prev\">上一页<b></b></a><a href=\"?        cat=670%2C671%2C672&page=2\" class=\"next\">下一页<b></b></a></div>'''match = re.search(r'''<div class=\\"pagin pagin-m\\">.*/(\d+)</span>''', html)if match:    print match.group(1)else:    print match
输出为25



0 0
原创粉丝点击