我正试图摆脱对BeautifulSoup的依赖,我喜欢它,但它似乎(积极地)得不到支持。我正在尝试使用html5lib和lxml,但是我似乎不知道如何使用"find“和"findall”运算符。
通过查看html5lib的文档,我想出了一个测试程序:
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。
谁能让我重回正轨?
发布于 2010-09-13 07:06:38
通常,对HTML使用lxml.html。然后,您就不必担心生成自己的解析器了&不必担心名称空间。
>>> 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选择器,我发现这是一种更简单的语法。
>>> doc.cssselect('tr')
[<Element tr at ...>, <Element tr at ...>] #doctest: +ELLIPSIS发布于 2011-05-18 06:17:57
您可以使用以下命令关闭名称空间:etree_document = html5lib.parse(t, treebuilder="lxml", namespaceHTMLElements=False)
发布于 2010-09-13 04:09:01
看起来,使用" lxml“XHTML TreeBuilder会导致html5lib在html5lib名称空间中构建树--这是有意义的,因为lxml是一个XML库,而XHTML是将TreeBuilder表示为XML的方式。您可以将lxml的qname语法与find()方法结合使用,以执行以下操作:
root.find('.//{http://www.w3.org/1999/xhtml}tr')或者,您可以使用lxml的完整XPath函数来执行以下操作:
root.xpath('.//html:tr', namespaces={'html': 'http://www.w3.org/1999/xhtml'})lxml documentation提供了有关如何使用XML名称空间的更多信息。
https://stackoverflow.com/questions/3696265
复制相似问题