Python 原始字符串与 HTML 解析

1 投票
2 回答
2898 浏览
提问于 2025-04-17 00:37

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 个回答

1

看看这个回答。看起来Python的urllib模块使用起来不太友好,尤其是在处理Unicode字符方面。它似乎让你不得不面对一些难看的原始字节内容,而不是直接把它们解码成正常的字符串。

4

你似乎有点困惑。

所谓的“字符串字面量”,就是你在程序里输入的字符串。因为字符串需要有明确的开始和结束,所以某些字符在字符串中间出现时会变得不方便,这时候就需要用转义序列来表示它们。

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)

撰写回答