Python 原始字符串与 HTML 解析
Python中的原始字符串和字符串字面量是怎么回事呢?我正在尝试制作一个网络爬虫,从一个网站上下载PDF文件。当我搜索字符串时,它能正常工作,但当我在Python中实现时,总是得到None作为我的结果。
import urllib
import re
url="" //insert url here
sock=urllib.urlopen(url)
htmlSource=sock.read();
sock.close();
m=re.match(r"<a href.*?pdf[^>]*?", raw(htmlSource))
print m
$ python temp.py
None
原始函数可以在这里找到:http://code.activestate.com/recipes/65211-convert-a-string-into-a-raw-string/
那么,我该如何完成这个程序,以便我可以打印出所有匹配的结果,然后下载PDF文件呢?
谢谢!
2 个回答
看看这个回答。看起来Python的urllib
模块使用起来不太友好,尤其是在处理Unicode字符方面。它似乎让你不得不面对一些难看的原始字节内容,而不是直接把它们解码成正常的字符串。
你似乎有点困惑。
所谓的“字符串字面量”,就是你在程序里输入的字符串。因为字符串需要有明确的开始和结束,所以某些字符在字符串中间出现时会变得不方便,这时候就需要用转义序列来表示它们。
Python 提供了“原始”字符串字面量,它的转义序列处理规则和普通字符串不同:用来判断字符串结束的规则是一样的(所以一个反斜杠后面跟着开引号不会结束字符串),但反斜杠之间的内容不会被转换。因此,虽然 '\''
是一个包含单引号的字符串(中间的 \'
是一个转义序列,表示引号),但 r'\''
是一个包含反斜杠和引号的字符串。
原始字符串字面量生成的对象类型是 str
,和普通字符串字面量生成的类型是一样的。这种字符串通常用于正则表达式的模式,因为正则表达式中常常需要包含很多反斜杠。如果你想写一个正则表达式来匹配源文本中的反斜杠,而没有原始字符串字面量的话,你可能会惊讶地发现需要在引号之间放四个反斜杠:Python 编译器会把它解释为一个包含两个真实反斜杠的字符串,而这又代表了正则表达式语法中的“匹配一个反斜杠”。
你找到的这个函数是一个不太完美的尝试,想要把转义序列重新引入到输入文本中。这并不是你想要做的事情,其实也没什么意义,而且也不符合作者的原意。它似乎是基于和你一样的误解。所谓“字符串的原始等价物”这个概念是没有意义的。实际上,根本没有“原始字符串”这种东西;原始字符串 字面量 只是为了方便创建普通字符串。
你想要在 htmlSource
中搜索某个模式。它 已经是你需要的形式。你的问题和 字符串转义没有关系。当字符串来自用户输入、文件输入,或者基本上任何其他来源时,它不会像字符串字面量那样被处理,除非你明确安排这样做。 如果网页中包含一个反斜杠后面跟着一个 n,那么通过 urllib
读取的字符串在相应的位置就是一个反斜杠后面跟着一个 n,而不是换行符。
问题是这样的:你想要搜索字符串,正如你所说的:“当我搜索字符串时,它是有效的”。你现在是在匹配字符串。请查看文档:
Help on function match in module re:
match(pattern, string, flags=0)
Try to apply the pattern at the start of the string, returning
a match object, or None if no match was found.
你的模式并没有出现在字符串的开头,因为网页的 HTML 并不是以你要找的 <a>
标签开始的。
你想要 m=re.search(r"<a href.*?pdf[^>]*?", htmlSource)
。