次のインスタンスを持つ html ファイルがあります。
<p>[CR][LF]
Here is the text etc
と:
...here is the last part of the text.[CR][LF]
</p>
ここで[CR]
、 と[LF]
はキャリッジ リターンと改行をそれぞれ表します。
これらの段落は、特定のクラスを持つ div 内にありますmy_class
。
この特定の div クラス内の段落タグをターゲットにして、次の置換を実行したいと考えています。
# remove new line after opening <p> tag
re.sub("<p>\n+", "<p>", div)
# remove new line before closing </p> tag
re.sub("<p>\n+", "<p>", div)
したがって、私のアプローチは次のとおりです。
- htmlファイルを開く
- 特定の div を分離する
<p>
これらの div 内のタグを分離します<p>
これらのタグでのみ置換を実行します- 修正内容を元のhtmlファイルに書き戻す
これは私がこれまでに持っているものですが、置換に到達してファイルに書き戻すと、ロジックは失敗します:
from bs4 import BeautifulSoup
import re
# open the html file in read mode
html_file = open('file.html', 'r')
# convert to string
html_file_as_string = html_file.read()
# close the html file
html_file.close()
# create a beautiful soup object
bs_html_file_as_string = BeautifulSoup(html_file_as_string, "lxml")
# isolate divs with specific class
for div in bs_html_file_as_string.find_all('div', {'class': 'my_class'}):
# perform the substitutions
re.sub("<p>\n+", "<p>", div)
re.sub("\n+</p>", "</p>", div)
# open original file in write mode
html_file = open('file', 'w')
# write bs_html_file_as_string (with substitutions made) to file
html_file.write(bs_html_file_as_string)
# close the html file
html_file.close()
美しいスープのreplace_withも見てきましたが、ここに関連しているかどうかはわかりません。
編集:
以下の解決策は、re.sub を使用せずにタスクを完了する別の方法を示しました。
within a specific class
ただし、別の置換を実行する必要がありますが、 re.subを実行できるかどうかはまだわかりませんwithin a paragraph
。[CR][LF]
具体的には、次の例では、すべてのを に置き換えたいと考えてい</p>\n<p>
ます。私はこれがサブで起こることを想定していました:
re.sub('\n+', r'</p>\n<p>', str)
改行と改行を示す SciTE エディターのスクリーンショット:
デモ HTML (demo_html.html):
<html>
<body>
<p>lalalalalalalala</p>
<p>lalalalalalalala</p>
<div class="my_class">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum..consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit."Lorem ipsum dolor sit amet", consectetur adipisc'ing elit.Lorem ipsum dolor...sit amet, consectetur adipiscing elit..
Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit..
.....Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
<p>lalalalalalalala</p>
<p>lalalalalalalala</p>
</body>
</html>
デモ Python (demo_python.py):
from bs4 import BeautifulSoup
import re
with open('demo_html.html', 'r') as html_file:
html_file_as_string = html_file.read()
bs_html_file_as_string = BeautifulSoup(html_file_as_string, "lxml")
for div in bs_html_file_as_string.find_all('div', {'class': 'my_class'}):
for p in div.find('p'):
p.string.replace('\n','</p>\n<p>')
with open('demo_html.html', 'w') as html_file:
html_file.write(bs_html_file_as_string.renderContents())
print 'finished'