【问题标题】:Python raw strings and html parsingPython 原始字符串和 html 解析
【发布时间】:2011-08-30 02:53:58
【问题描述】:

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?

谢谢!

【问题讨论】:

  • 您使用正则表达式而不是 a real HTML parser 的任何原因?
  • 这对我来说也只是一个正则表达式练习
  • 这个问题不是关于“Python 原始文字”的,是吗?
  • 标题应该是原始字符串,我猜。我不太确定,因为如果我将代码中的“raw(htmlSource)”替换为实际源代码,它就可以正常工作。但现在它返回 None
  • 您可以使用 '%r' % htmlSource 而不是 raw 来获取 Python 原始字符串。你有理由解析原始字符串而不是真正的字符串吗?

标签: python


【解决方案1】:

你似乎很困惑。

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

Python 提供了“原始”字符串文字,这些文字对于如何解释转义序列有不同的规则:相同的规则用于确定字符串的结束位置(因此单个反斜杠后跟引号字符不会终止字符串),但是反斜杠之间的内容不会被转换。因此,虽然'\'' 是由单引号字符组成的字符串(中间的\' 是产生引号的转义序列),但r'\'' 是由反斜杠和引号字符组成的字符串。

原始字符串字面量生成str 类型的对象。它与普通字符串文字产生的类型相同。这些通常用于正则表达式操作的 模式,因为用于正则表达式的字符串通常需要包含大量反斜杠。如果您想编写一个匹配源文本中反斜杠的正则表达式,并且您没有原始字符串文字,那么您可能需要在源代码中的引号之间放置四个反斜杠:Python 编译器会将其解释为包含两个实际反斜杠的字符串,这反过来表示正则表达式语法中的“匹配反斜杠”。

您发现的函数是将转义序列重新引入输入文本的不完美尝试。 这不是你想做的,甚至没有真正的意义,也不符合作者自己的规范。这似乎是基于与您类似的误解。字符串的“原始等价物”的概念是荒谬的。实际上,没有“原始字符串”这样的东西;原始字符串 literals 可以方便地创建普通字符串。

您想在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 不是以您要查找的 &lt;a&gt; 标记开头。

你想要m=re.search(r"&lt;a href.*?pdf[^&gt;]*?", htmlSource)

【讨论】:

    【解决方案2】:

    查看this answer。似乎 Python 的 urllib 在用户友好性和 Unicode 友好性方面远不如应有的那么好。这似乎迫使您处理丑陋的原始字节内容,而不是为您将其解码为普通字符串。

    【讨论】:

    • OP 的问题似乎与 unicode 无关,尽管这肯定会导致进一步的问题。至少在 2.x 中,Python 乐于将“丑陋的原始字节内容”视为字符串。这并不像尝试使用正则表达式解析 HTML 那样糟糕;) 并且 OP 对“原始字符串”的明显混淆是 IMO 的一个更重要的问题。 (r'' 不是 u'' 的反义词。)
    • @tchrist 我以为你说“对独角兽友好”,然后很兴奋:/
    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2013-07-07
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多