Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用html5lib解析HTML,并使用XPath查询解析后的HTML?_Python_Parsing_Xpath_Lxml_Html5lib - Fatal编程技术网

Python 如何使用html5lib解析HTML,并使用XPath查询解析后的HTML?

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>

我正在尝试使用html5lib将html页面解析为可以使用xpath查询的内容。html5lib几乎没有文档,我花了太多时间试图解决这个问题。最终目标是拉出表的第二行:

<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