1

Mechanize を使用してページをロードしました。

url = 'http://www.blah.com'
agent = Mechanize.new
page = agent.get(url)

XPathセレクターを使用して要素にアクセスしようとしました:

found = page.at('/html/body/table')

nil私の制御範囲外の HTML には、あるべきではない開始タグがあるため、返されます。

<html>
  <body>
    <tr>
    <table>
      . . .

ブラウザが実際にページをレンダリングするとき、Firefox が呼ぶ「迷子の開始タグ」は無視されます (そして、Firefox はそれを無視する xpath を私に与えます)、Nokogiri はそれ以上の余分なものを見ることができません<tr>

このようなぶら下がっているタグの HTML をきれいにする方法はありますか?

4

3 に答える 3

2

壊れにくい XPath クエリを使用しますか?

found = page.at('//table')
于 2012-10-10T15:38:59.850 に答える
2

あなたの例では、次のようになります。

page.at '/html/body/tr/table'

しかし、おそらく次のようにする方が理にかなっています。

page.at 'table'
于 2012-10-09T03:57:48.800 に答える
0

ノコギリを使えば簡単に掃除できます。

require 'nokogiri'

html = '<html><body><tr><table><tr><td>foo</td></tr></table></tr></body></html>'
doc = Nokogiri::HTML(html)

inner_table = doc.at('//body/tr/table')
if (inner_table)
  doc.at('body tr').replace(inner_table)
end

puts doc.to_html

結果は次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><table><tr><td>foo</td></tr></table></body></html>

HTML がより複雑な場合は、ノード チェーンに似たある種のマーカーを見つけて<body><tr><table>、上記のコードに置き換えます。

XPath アクセサーと CSS アクセサーの両方を混在させていることに注意してください。私は読みやすさのために CSS を好みますが、XPath を使用すると、何かを理解しやすくなったり、自己文書化したりすることができます。

また、Nokogiri のatメソッドで XPath と CSS の両方を使用していることにも注意してください。Nokogiri はとの両方atをサポートしていますが、アクセサとして使用しているのは CSS または XPath であることを Nokogiri に明示的に伝える必要がない限り、私はこれらに依存しています。便利なものです。ノコギリの方法も同様です。at_cssat_xpathatsearch

于 2012-10-10T16:23:58.277 に答える