0

編集:これを行う方法を知っています。私は解決策を探しているのではなく、時間をかけてスクリプト言語で自分で何かを書く前に、プロセスまたは既存のプログラムの推奨事項を探しています。

さまざまなディレクトリにいくつかの HTML ファイルがあり、それらはすべて同様の構造を持っています。

<html>
    <head>...</head>
    <body>
        <nav>...</nav>
        <section>...</section>
    </body>
</html>

指定したすべてのファイルについて、プログラムで HTML セクションを他のセクションに置き換えたい (たとえば、ブロックを[選択したファイルで指定された]<nav>別のブロックに置き換える)。nav

理想的な解決策は、ある種のツールを使用するlxmlか、Python で同様のものになると思いますが、* nixy ツールまたはこれを行う既存のプログラムを使用して簡単に行う方法があれば、代わりに喜んでそれを行いますスクリプトをまとめる。

4

3 に答える 3

3

正規表現または文字列解析を使用しないでください。頭が痛くなるだけです。パーサーを使用します。

Ruby では Nokogiri を使用します。

require 'nokogiri'

html = '
<html>
  <body>
    <nav>...</nav>
    <section>...</section>
  </body>
</html>
'
doc = Nokogiri::HTML(html)

nav = doc.at('nav').content = "this is a new block"
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>
    <nav>this is a new block</nav><section>...</section>
</body></html>

"this is a new block"もちろん、次のようなものに置き換えたいと思うでしょうFile.read('snippet.html')

置換ファイルにnavコンテンツではなく HTML スニペットが含まれている場合は、代わりにこれを使用します。

nav = doc.at('nav').replace('<nav>this is a new block</nav>')

出力は同じになります。(そして、繰り返しになりFile.readますが、それがあなたのやり方である場合は、ファイルからそれを取得するために使用します。)

Nokogiri ではat、CSS または XPath アクセサーによって指定されたタグの最初のインスタンスを見つけて、ノードを返します。上記のCSSを使用しました//navが、うまくいきました。atアクセサーのタイプを推測します。あいまいなアクセサーを持つ可能性があるため、特定したい場合はat_cssorを使用できます。at_xpathまた、searchNokogiri には、配列のように機能する NodeSet を返す があります。必要なことを実行して、結果を反復処理できます。また、 のようatに、CSS と XPath 固有のバージョンがそれぞれcssありxpathます。

Nokogiri には CLI インターフェースがあり、この例のような単純なものであれば機能しますが、sed または Ruby/Perl/Python ワンライナーでも実行できます。

curl -s http://nokogiri.org | nokogiri -e'p $_.css("h1").length'

ただし、HTML がこれほど単純であることはめったになく、特に徘徊していることが判明したものはすべて、CLI やワンライナー ソリューションは急速に制御不能になるか、単に機能しなくなります。何年にもわたって多くのスパイダーや RSS アグリゲーターを書いてきたことに基づいていると言えます。最初は単純なものでも、追加の HTML や XML ソースを導入すると、より複雑になり、決して簡単になることはありません。パーサーを使用することで、最初にパーサーに行くことを学びました。

于 2013-04-25T13:58:06.907 に答える
3

こんな感じで BeautifulSoup for Python が使えるかもしれません。

import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(htmldata)
nav = soup.find("nav")
nav.name = "new name"

例えば:

import BeautifulSoup

html_data = "<nav>Some text</nav>"
soup = BeautifulSoup.BeautifulSoup(html_data)
nav = soup.find("nav")
nav.name = "nav2"

変更予定:<nav></nav><nav2></nav2>

于 2013-04-25T13:17:21.600 に答える