首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeautifulSoup用户的html5lib/lxml示例?

BeautifulSoup用户的html5lib/lxml示例?
EN

Stack Overflow用户
提问于 2010-09-13 03:35:09
回答 5查看 5K关注 0票数 1

我正试图摆脱对BeautifulSoup的依赖,我喜欢它,但它似乎(积极地)得不到支持。我正在尝试使用html5lib和lxml,但是我似乎不知道如何使用"find“和"findall”运算符。

通过查看html5lib的文档,我想出了一个测试程序:

代码语言:javascript
复制
import cStringIO

f = cStringIO.StringIO()
f.write("""
  <html>
    <body>
      <table>
       <tr>
          <td>one</td>
          <td>1</td>
       </tr>
       <tr>
          <td>two</td>
          <td>2</td
       </tr>
      </table>
    </body>
  </html>
  """)
f.seek(0)

import html5lib
from html5lib import treebuilders
from lxml import etree  # why?

parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("lxml"))
etree_document = parser.parse(f)

root = etree_document.getroot()

root.find(".//tr")

但是这将返回None。我注意到,如果我做一个etree.tostring(root),我会得到我所有的数据,但我所有的标签都以html (例如<html:table>)开头。但是root.find(".//html:tr")抛出了一个KeyError。

谁能让我重回正轨?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-13 07:06:38

通常,对HTML使用lxml.html。然后,您就不必担心生成自己的解析器了&不必担心名称空间。

代码语言:javascript
复制
>>> import lxml.html as l
>>> doc = """
...    <html><body>
...    <table>
...      <tr>
...        <td>one</td>
...        <td>1</td>
...      </tr>
...      <tr>
...        <td>two</td>
...        <td>2</td
...      </tr>
...    </table>
...    </body></html>"""
>>> doc = l.document_fromstring(doc)
>>> doc.finall('.//tr')
[<Element tr at ...>, <Element tr at ...>] #doctest: +ELLIPSIS

仅供参考,lxml.html还允许您使用CSS选择器,我发现这是一种更简单的语法。

代码语言:javascript
复制
>>> doc.cssselect('tr')
[<Element tr at ...>, <Element tr at ...>] #doctest: +ELLIPSIS
票数 5
EN

Stack Overflow用户

发布于 2011-05-18 06:17:57

您可以使用以下命令关闭名称空间:etree_document = html5lib.parse(t, treebuilder="lxml", namespaceHTMLElements=False)

票数 6
EN

Stack Overflow用户

发布于 2010-09-13 04:09:01

看起来,使用" lxml“XHTML TreeBuilder会导致html5lib在html5lib名称空间中构建树--这是有意义的,因为lxml是一个XML库,而XHTML是将TreeBuilder表示为XML的方式。您可以将lxml的qname语法与find()方法结合使用,以执行以下操作:

代码语言:javascript
复制
root.find('.//{http://www.w3.org/1999/xhtml}tr')

或者,您可以使用lxml的完整XPath函数来执行以下操作:

代码语言:javascript
复制
root.xpath('.//html:tr', namespaces={'html': 'http://www.w3.org/1999/xhtml'})

lxml documentation提供了有关如何使用XML名称空间的更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3696265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档