python原始字符串和字符串文字如何工作?我正在尝试制作一个webscraper从网站下载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文件?
谢谢!
答案 0 :(得分:4)
你好像很困惑。
'string literal'是您在程序中键入的字符串。因为字符串需要有明确的开头和结尾,所以某些字符在字符串中间变得不方便,必须使用转义序列来表示它们。
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)
。
答案 1 :(得分:1)
结帐this answer。似乎Python的urllib
对用户友好程度要低得多,而且比用它更友好。它似乎迫使你处理丑陋的原始字节内容,而不是将它解码为普通字符串。