用lxml编码的大写html标签

Sangamesh Hs

我正在使用lxml.html ....解析html文件。该html文件包含带有小写字母和大写字母的标签。我的代码的一部分如下所示:

        response = urllib2.urlopen(link)
        html = response.read().decode('cp1251')
        content_html = etree.HTML(html_1)
        first_link_xpath =  content_html.xpath('//TR')
        print (first_link_xpath)

我的HTML文件的一小部分显示如下:

<TR>
    <TR vAlign="top" align="left">
        <!--<TD><B  onmouseover="tips.Display('Metadata_WEB', event)" onmouseout="tips.Hide('Metadata_WEB')">Meta Data:</B></TD>-->
        <TD></TD>
    </TR>
 </TR>

因此,当我为以下html示例运行以上代码时,它会提供一个空列表。然后,我尝试运行此行first_link_xpath = content_html_1.xpath('//tr/node()'),所有大写标记均如\r\n\t\t\t\t'输出所示:此问题背后的原因是什么?

注意:如果问题不能令人信服,请告诉我以进行修改

保罗·特姆布雷斯

为了跟进unutbu的回答,我建议您比较lxmlXML和HTML解析器,尤其是通过使用来查询树的表示形式,从而比较它们如何表示文档lxml.etree.tostring()您会看到不同的标签,标签的大小写和层次结构(可能与人类的想法有所不同;)

$ python
>>> import lxml.etree
>>> doc = """<TR>
...     <TR vAlign="top" align="left">
...         <!--<TD><B  onmouseover="tips.Display('Metadata_WEB', event)" onmouseout="tips.Hide('Metadata_WEB')">Meta Data:</B></TD>-->
...         <TD></TD>
...     </TR>
...  </TR>"""
>>> xmldoc = lxml.etree.fromstring(doc)
>>> xmldoc
<Element TR at 0x1e79b90>
>>> htmldoc = lxml.etree.HTML(doc)
>>> htmldoc
<Element html at 0x1f0baa0>
>>> lxml.etree.tostring(xmldoc)
'<TR>\n    <TR vAlign="top" align="left">\n        <!--<TD><B  onmouseover="tips.Display(\'Metadata_WEB\', event)" onmouseout="tips.Hide(\'Metadata_WEB\')">Meta Data:</B></TD>-->\n        <TD/>\n    </TR>\n </TR>'
>>> lxml.etree.tostring(htmldoc)
'<html><body><tr/><tr valign="top" align="left"><!--<TD><B  onmouseover="tips.Display(\'Metadata_WEB\', event)" onmouseout="tips.Hide(\'Metadata_WEB\')">Meta Data:</B></TD>--><td/>\n    </tr></body></html>'
>>> 

您可以看到,使用HTML解析器创建了附件htmlbody标签,并且tr开头有一个空节点,因为在HTML中,atr不能直接跟在tr(您输入的HTML片段由于错字错误或原始文件也坏了)

然后,再次按照unutbu的建议,您可以试用不同的XPath表达式:

>>> xmldoc.xpath('//tr')
[]
>>> xmldoc.xpath('//TR')
[<Element TR at 0x1e79b90>, <Element TR at 0x1f0baf0>]
>>> xmldoc.xpath('//TR/node()')
['\n    ', <Element TR at 0x1f0baf0>, '\n        ', <!--<TD><B  onmouseover="tips.Display('Metadata_WEB', event)" onmouseout="tips.Hide('Metadata_WEB')">Meta Data:</B></TD>-->, '\n        ', <Element TD at 0x1f0bb40>, '\n    ', '\n ']
>>> 
>>> htmldoc.xpath('//tr')
[<Element tr at 0x1f0bbe0>, <Element tr at 0x1f0bc30>]
>>> htmldoc.xpath('//TR')
[]
>>> htmldoc.xpath('//tr/node()')
[<!--<TD><B  onmouseover="tips.Display('Metadata_WEB', event)" onmouseout="tips.Hide('Metadata_WEB')">Meta Data:</B></TD>-->, <Element td at 0x1f0bbe0>, '\n    ']
>>> 

确实,正如unutbu强调的那样,对于HTML,XPath表达式应使用小写标记选择元素。

对我来说,'\ r \ n \ t \ t \ t \ t'输出不是错误,它只是varianttrtd标记之间的空白对于文本内容,如果您不需要此空格,则可以使用lxml.etree.tostring(element, memthod="text", encoding=unicode).strip()element例如XPath来的。(这适用于前导和尾随空格)。(请注意,该method参数很重要,默认情况下,它将输出上面测试过的HTML表示形式)

>>> map(lambda element: lxml.etree.tostring(element, method="text", encoding=unicode), htmldoc.xpath('//tr'))
[u'', u'\n    ']
>>> 

并且您可以验证文本表示形式是否为空白。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用lxml,python,.tail解析的HTML被<br>标签分解

来自分类Dev

用lxml,python,.tail解析的HTML被<br>标签分解

来自分类Dev

HTML标签编码器

来自分类Dev

用C编码HTML字符

来自分类Dev

如何用HTML编码的字符大写法语单词?

来自分类Dev

用lxml / xpath解析html元素

来自分类Dev

通过xpath用lxml解析html的问题

来自分类Dev

使用lxml通过unicode编码检索标签和子标签类别

来自分类Dev

使用lxml解析html文档时的编码问题

来自分类Dev

从编码行解码特定的HTML标签

来自分类Dev

对html标签使用大写字母是否不好?

来自分类Dev

用空格替换html标签

来自分类Dev

用Nokogiri排除HTML标签

来自分类Dev

使用lxml解析Yelp-忽略html标签

来自分类Dev

lxml.html 没有找到 body 标签

来自分类Dev

在 PHP 中将编码的 url 的编码部分大写

来自分类Dev

用大写字母命令获取应用于元素的所有标签的列表

来自分类Dev

从内容中提取html标签:在Yahoo Pipes中编码

来自分类Dev

带有HTML样式标签的URL中的“&”号编码

来自分类Dev

禁用 PHP 文件中硬编码 HTML 标签的输出

来自分类Dev

用Javascript抓取内部html标签

来自分类Dev

用Perl regex计数html标签

来自分类Dev

用html标签搜索字符串

来自分类Dev

用jsoup库解析html meta标签

来自分类Dev

用jQuery查找HTML标签号

来自分类Dev

用html标签规范空间问题

来自分类Dev

用Grunt-Replace替换HTML标签

来自分类Dev

用php自动替换标签HTML

来自分类Dev

Rails表单标签大写问题