Python 如何使用html5lib解析HTML,并使用XPath查询解析后的HTML?
我正在尝试使用html5lib将html页面解析为可以使用xpath查询的内容。html5lib几乎没有文档,我花了太多时间试图解决这个问题。最终目标是拉出表的第二行:Python 如何使用html5lib解析HTML,并使用XPath查询解析后的HTML?,python,parsing,xpath,lxml,html5lib,Python,Parsing,Xpath,Lxml,Html5lib,我正在尝试使用html5lib将html页面解析为可以使用xpath查询的内容。html5lib几乎没有文档,我花了太多时间试图解决这个问题。最终目标是拉出表的第二行: <html> <table> <tr><td>Header</td></tr> <tr><td>Want This</td></tr> </table>
<html>
<table>
<tr><td>Header</td></tr>
<tr><td>Want This</td></tr>
</table>
</html>
标题
要这个吗
因此,让我们尝试一下:
>>> doc = html5lib.parse('<html><table><tr><td>Header</td></tr><tr><td>Want This</td> </tr></table></html>', treebuilder='lxml')
>>> doc
<lxml.etree._ElementTree object at 0x1a1c290>
>doc=html5lib.parse('HeaderWant This',treebuilder='lxml'))
>>>医生
看起来不错,让我们看看还有什么:
>>> root = doc.getroot()
>>> print(lxml.etree.tostring(root))
<html:html xmlns:html="http://www.w3.org/1999/xhtml"><html:head/><html:body><html:table><html:tbody><html:tr><html:td>Header</html:td></html:tr><html:tr><html:td>Want This</html:td></html:tr></html:tbody></html:table></html:body></html:html>
>root=doc.getroot()
>>>打印(lxml.etree.tostring(根))
头儿要这个吗
哈哈哈
真的。我计划使用一些xpath来获取我想要的数据,但这似乎不起作用。那我该怎么办?我愿意尝试不同的库和方法。尝试使用jquery。您可以检索所有元素。或者,您可以在您的行上放置一个id并将其拉出 1) $(“td”)[1]。innerHTML将是您想要的 2)
$(“#blah”).text()将是您想要的我相信您可以在lxml对象上进行css搜索。。像这样
elements = root.cssselect('div.content')
data = elements[0].text
使用,您可以使用>>> soup = BeautifulSoup.BeautifulSoup('<html><table><tr><td>Header</td></tr><tr><td>Want This</td></tr></table></html>')
>>> soup.findAll('td')[1].string
u'Want This'
>>> soup.findAll('tr')[1].td.string
u'Want This'
>>soup=beautifulsou.beautifulsou('HeaderWant This'))
>>>soup.findAll('td')[1]。字符串
你想要这个
>>>soup.findAll('tr')[1].td.string
你想要这个
(显然这是一个非常粗糙的例子,但是是的。)缺少文档是避免使用IMO库的一个很好的理由,不管它有多酷。你是否已经习惯于使用html5lib了?你看过吗 以下是使用lxml实现此目的的一种方法:
from lxml import html
tree = html.fromstring(text)
[td.text for td in tree.xpath("//td")]
结果:
['Header', 'Want This']
我总是建议尝试
lxml
library。它速度极快,有很多特点
如果您需要,它还支持html5lib解析器:
>>从lxml.html导入fromstring,tostring
>>>html=”“”
...
...
…标题
…想要这个
...
...
... """
>>>doc=fromstring(html)
>>>tr=doc.cssselect('table tr')[1]
>>>打印到字符串(tr)
要这个吗
您想要使用的是namespacehtmlements
参数,由于某些原因,该参数默认为True
doc = html5lib.parse('''<html>
<table>
<tr><td>Header</td></tr>
<tr><td>Want This</td></tr>
</table>
</html>
''', treebuilder='lxml', namespaceHTMLElements=False)
print lxml.html.tostring(doc)
doc=html5lib.parse(“”)
标题
要这个吗
'',treebuilder='lxml',namespacehtmlements=False)
打印lxml.html.tostring(doc)
不过,使用lxml.html可能更容易。因为html5lib(默认情况下)会创建包含(正确的)名称空间信息的树,您也可以在查询中指定(正确的)名称空间
XPath查询示例:
import html5lib
inp='''<html>
<table>
<tr><td>Header</td></tr>
<tr><td>Want This</td></tr>
</table>
</html>'''
xns = '{http://www.w3.org/1999/xhtml}'
d = html5lib.parse(inp)
s = d.findall('.//{}td'.format(xns))[-1].text
print(s)
或者,您也可以告诉html5lib在解析过程中避免添加任何名称空间信息:
d = html5lib.parse(inp, namespaceHTMLElements=False)
s = d.findall('.//td')[-1].text
print(s)
输出:
Want This
Want This
想要这个我想请求的是Python解决方案。我会这样做,除了我会使用“print doc.cssselect('tr')[1].text_content()”来获取第二行的内容,而不是让lxml显示HTML。这是最相关的答案。非常感谢!它默认为
True
,因为HTML规范将这些元素定义在HTML名称空间中-现有Python工具要求它们不在名称空间中是该选项存在的原因。看起来它使用名称空间限定了元素,并插入了一些未指定的“隐含”元素。
d = html5lib.parse(inp, namespaceHTMLElements=False)
s = d.findall('.//td')[-1].text
print(s)
Want This