【问题标题】:html parsing with lxml when there's no root tag没有根标签时用lxml解析html
【发布时间】:2012-04-17 02:40:41
【问题描述】:

我一直在使用 lxml 和 formchemy 为 sqlalchemy 构建一个脚手架库,但我很难让它们很好地发挥作用。具体来说,formalchemy.FieldSet.render() 返回一个没有根标记的 html 片段,我似乎无法弄清楚如何让 lxml 将其解析为可以包含在元素树中的内容:

我得到了什么:

>>> lxml.etree.fromstring(formalchemy.FieldSet(toyschema.User(), session).render())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 2743, in lxml.etree.fromstring (src/lxml/lxml.etree.c:52665)
  File "parser.pxi", line 1573, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:79932)
  File "parser.pxi", line 1445, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:78709)
  File "parser.pxi", line 920, in lxml.etree._BaseParser._parseUnicodeDoc (src/lxml/lxml.etree.c:75083)
  File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739)
  File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614)
  File "parser.pxi", line 585, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955)
lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 8, column 1

我想要什么:

>>> ?????(formalchemy.FieldSet(toyschema.User(), session).render())
[<Element div at 0x1e48e10>, <Element script at 0x1e48cd0>, <Element div at 0x1e48730>, <Element div at 0x1ea1e60>]

我的粗略解决方法:

>>> lxml.etree.fromstring('<root>%s</root>' % formalchemy.FieldSet(toyschema.User(), session).render()).getchildren()
[<Element div at 0x1e48e10>, <Element script at 0x1e48cd0>, <Element div at 0x1e48730>, <Element div at 0x1ea1e60>]

【问题讨论】:

    标签: python lxml formalchemy


    【解决方案1】:

    对于解析 HTML,您要使用 lxml.html,而不是 lxml.etree。

    如果您想要一个片段列表而不是将它们包装在div 中,您可以使用fragments_fromstring(string),如here 所述。

    【讨论】:

    • 嗯,这似乎更接近了一点,但它有条件地将生成的树包装到一个 div 或 span 中,这与我的想法并不完全一致。 +1 建议改进。
    • 这会将标签名称更改为小写。最好先做lxml.etree.fromstring('&lt;a&gt;{}&lt;/a&gt;'.format(string)),然后再做result.getchildren()。
    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2015-10-06
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多