Python原始字符串和html解析

时间:2011-08-30 02:53:59

标签: python

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

谢谢!

2 个答案:

答案 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对用户友好程度要低得多,而且比用它更友好。它似乎迫使你处理丑陋的原始字节内容,而不是将它解码为普通字符串。