19

html5libを使用して、xpathでクエリできるものにhtmlページを解析しようとしています。html5libのドキュメントはほぼゼロであり、この問題を理解するために多くの時間を費やしてきました。最終的な目標は、テーブルの2番目の行を引き出すことです。

<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>

それはよさそうだ、私たちが他に何を持っているか見てみましょう:

>>> 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>

笑WUT?

真剣に。xpathを使用して必要なデータを取得することを計画していましたが、うまくいかないようです。それで、なにかお手伝いできますか?私はさまざまなライブラリとアプローチを試してみようと思っています。

4

7 に答える 7

24

ドキュメントの欠如は、それがどんなにクールであっても、ライブラリIMOを避ける良い理由です。html5libを使用することに夢中になっていますか?lxml.htmlを見たことがありますか?

lxmlを使用してこれを行う方法は次のとおりです。

from lxml import html
tree = html.fromstring(text)
[td.text for td in tree.xpath("//td")]

結果:

['Header', 'Want This']
于 2010-04-01T05:13:30.257 に答える
19

使用したいのはnamespaceHTMLElements引数です。これは、何らかの理由でデフォルトで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)

ただし、lxml.htmlを使用する方がおそらく簡単です。

于 2011-02-22T02:03:29.147 に答える
4

私はいつも図書館を試すことをお勧めしlxmlます。それは非常に高速で、多くの機能を備えています。

必要に応じて、html5libパーサーもサポートしています:html5parser

>>> from lxml.html import fromstring, tostring

>>> html = """
... <html>
...     <table>
...         <tr><td>Header</td></tr>
...         <tr><td>Want This</td></tr>
...     </table>
... </html>
... """
>>> doc = fromstring(html)
>>> tr = doc.cssselect('table tr')[1]
>>> print tostring(tr)
<tr><td>Want This</td></tr>
于 2010-04-01T05:17:53.713 に答える
1

私はあなたがlxmlオブジェクトでcss検索を行うことができると信じています..そのように

elements = root.cssselect('div.content')
data = elements[0].text
于 2010-04-01T04:33:36.297 に答える
1

BeautifulSoupを使用すると、

>>> 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'

(明らかに、それは本当に大雑把な例ですが、そうです。)

于 2010-04-01T04:36:17.963 に答える
1

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)

出力:

これが欲しい

XPathなしでも同じ結果:

s = d.find(xns+'body').find(xns+'table').find(xns+'tbody') \
     .findall(xns+'tr')[-1].find(xns+'td').text

または、解析中に名前空間情報を追加しないようにhtml5libに指示することもできます。

d = html5lib.parse(inp, namespaceHTMLElements=False)
s = d.findall('.//td')[-1].text
print(s)

出力:

これが欲しい
于 2017-04-19T17:08:16.070 に答える
-5

jqueryを使用してみてください。そして、すべての要素を取得できます。または、行にIDを付けて引き出すこともできます。

1)......。

$( "td")[1].innerHTMLはあなたが望むものになります

2)......。

$( "#blah")。text()はあなたが望むものになります

于 2010-04-01T04:30:37.680 に答える