浏览器和HTMLPaser实体解析差异

时间:2017-08-31 11:23:20

标签: python html python-2.7 html-entities

我在网页的HTML中有以下字符—。它在网页上呈现“ - ”(EM DASH)(如果有问题,则通过谷歌Chrome浏览器)。无论我如何使用文件编码(“utf-8”,“cp1251”,“cp866”),它在网页上总是“ - ”。但是当我运行以下python代码时:

from HTMLParser import HTMLParser

h_parser = HTMLParser()
print h_parser.unescape('—')

它在unicode表中输出一些控制符号,即“保护区末尾”。

我应该使用什么python代码从—字符串/ unicode字符串中获取“ - ”。我使用python2.7

1 个答案:

答案 0 :(得分:1)

字符引用中的数值(在您的情况下为151)是指Unicode代码点151(0x97),它位于Latin-1 Supplement中,代表控制字符。

很可能正在使用无效值151,因为它对应于Windows代码页1252中的短划线字符。它被浏览器呈现为短划线可能是尝试处理此常见错误。

em dash的正确字符引用为public JsonResult Datatable() { var parser = new DataTablesParser<Card>(Request, SomeIQueryableData); return Json(parser.Parse()); }

    <li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Brands" ? "nav-item selected" : "")" id="main-nav-item-128" data-id="128">
<a href="@Url.Action("Brands","Product", new { @id=15})" class="nav-link dropdown-toggle" aria-expanded="false" data-target="#dropdown-menu-128">Pwani Life Care </a></li>

     <li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Brands" ? "nav-item selected" : "")" id="main-nav-item-128" data-id="128">
<a href="@Url.Action("Brands","Product", new { @id=16})" class="nav-link dropdown-toggle" aria-expanded="false" data-target="#dropdown-menu-128"> Pwani Life Care </a> </li>

虽然Python 2对此很困难,但在Python 3中,html.unescape()函数显式处理HTML 5 spec中指定的无效字符引用。如果可能,您可以使用Python 3解决您的问题:

&#8212

如果您不能使用Python 3,您可以复制Python 3 >>> import unicodedata >>> unicodedata.name(unichr(151)) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: no such name >>> unicodedata.lookup('em dash') u'\u2014' >>> unicodedata.lookup('em dash').encode('cp1252') '\x97' 模块中的代码(请参阅__init__.py文件)并将HTML代码传递给它,然后再转交给{{1 }}