2011-08-30 125 views
1

python原始字符串和字符串文字如何工作?我试图让一个webscraper从一个网站下载pdf。当我搜索它工作的字符串,但是当我尝试实施它在python我总是没有我的答案Python原始字符串和html解析

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文件?

谢谢!

+7

你使用正则表达式而不是[真正的HTML解析器](http://www.crummy.com/software/BeautifulSoup/)的任何原因? –

+0

这部分的内容也只是我在正则表达式中的一个练习 – randomafk

+0

这个问题并不是真的关于“Python原始文字”,是吗? – Johnsyweb

回答

4

你似乎很困惑。

“字符串文字”是您键入到程序中的字符串。因为你的字符串需要有一个清晰的开始和结束,所以某些字符在字符串中间变得不方便,并且必须使用转义序列来表示它们。

Python提供了'原始'字符串文字,它们对于转义序列的解释有着不同的规则:相同的规则用于确定字符串结尾的位置(所以一个反斜杠,后面跟着开头引号字符, t终止字符串),但是然后反斜杠之间的东西不会被转换。因此,虽然'\''是一个由单引号字符组成的字符串(中间的\'是生成引号的转义序列),但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

结帐this answer。看起来Python的urllib比用户更友好 - 而且对Unicode友好。它似乎迫使你处理难看的原始字节内容,而不是将它解码为一个普通的字符串。

+0

OP的问题似乎并不涉及unicode,虽然这肯定会导致进一步的问题。至少在2.x中,Python很乐意将“难看的原始字节内容”视为一个字符串。这并不像尝试用正则表达式解析HTML那么糟糕;)OP对“原始字符串”的明显混淆是IMO的一个更为重要的问题。 ('r'''不是'u'''的反义词) –

+0

@tchrist我以为你说过“独角兽友好”,并且很兴奋:/ – Coldblackice