【问题标题】:Inquiry: Why is my regex code not reading all characters?查询:为什么我的正则表达式代码没有读取所有字符?
【发布时间】:2013-01-18 14:25:33
【问题描述】:

我有以下描述我想使用我的程序报废。

<hr>为 AFROTC 学员提供多达 13 个选项,用于实际领导和专业培训 通过接触美国空军的职能、部署和就业行动。外语和文化沉浸也可用/可能,但总体重点仍然是领导力发展和实习。所有计划都在选定的空军基地和美国和国外的其他地点进行。<br>

我有以下代码:

findDescription = re.findall('<hr>(.*?)(?:<strong>|<br>)', coursePage)

我得到以下输出:

['通过接触美国空军的职能、部署和就业行动,为 AFROTC 学员提供多达 13 种实际领导力和专业培训的选择。\xc2\xa0 外语和文化沉浸也可用/可能,但总体重点仍然是领导力发展和实习。\xc2\xa0 在选定的空军基地和美国和国外的其他地点进行的所有计划。']

为什么我会在这里收到 \xc2\xa0 这样的奇怪内容?我的代码也被引号" 绊倒了。坦率地说,我相信我的正则表达式代码中的句点 . 应该接受所有字符串。出了什么问题?

感谢任何快速提示。我在星期五才听说正则表达式,我已经取得了巨大的进步,但是这个真的让我绊倒了几个小时。

热烈的问候, 极客欧米茄

【问题讨论】:

  • 用正则表达式解析 HTML 是脆弱的。使用像 BeautifulSoup 这样已建立的库要健壮得多。 crummy.com/software/BeautifulSoup
  • 你能提供一个你的代码被双引号“绊倒”的例子吗?
  • 我认为它既是引号又是'符号。这是 ' 符号示例:accountant’s
  • @GeekyOmega Google HTML 实体编码。您的示例是一个 HTML 实体编码的字符串。您需要以某种方式对其进行解码(AndyLester 已经提到过 BeautifulSoup 可以做到这一点,但也有其他方法),以便获得将在浏览器中显示的文本。请注意,如果您将字符串粘贴到此处的框中:htmlentities.net 并单击“解码”,您将看到您期望和想要的输出。
  • +1 到@MarkAmery。如果您想在 Python 中对这些内容进行解码,SO 上有多个问题可以解释如何执行此操作。他们中的大多数似乎都在 this one 的相关列表中。

标签: python regex web-scraping


【解决方案1】:

\xC2\xA0 是 Unicode 字符 0xA0 的 UTF-8 编码,通常写为  在 html 文件中。

【讨论】:

  • 补充一点:调用re.findall不会引入字符。它们事先在 coursePage 中。
  • 还值得补充的是,有问题的字符是“不间断空格”:en.wikipedia.org/wiki/Non-breaking_space 如果您在 Python 中使用 print 来显示其中包含不间断空格的字符串,它将被显示为一个空间,足够合理。但是,print 对列表的每个元素调用 repr(而不是 print),并且在包含不间断空格的 utf-8 字节字符串上调用 repr 会以这种方式显示它显示在OP的帖子中。这可以解释他的困惑以及为什么他认为findall 引入了“奇怪的东西”。
  • 有趣。我把它放在列表中,然后调用列表中的元素。最终,我是否可以将其存储在 txt 或 .csv 中而不会出现此问题?
  • @写入文件时,不会写入斜线、x、C和2;它将写入'\xC2''\xA0' 对应的字节。只需.write 字符串,您就可以了(当然,只要您想要将一个有效的utf-8 编码字符串写入文件,其中包含一个不间断的空格。如果这不是如果不是您想要的,您可能需要进行某种查找和替换。如果您不确定是否是您想要的,那么我怀疑您需要阅读一下有关字符串编码的信息。 )。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2019-10-04
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多