2017-09-29 3 views
-3

私は多くのウェブサイトからデータを収集するためにScrapyを使用しています。私はScripField()宣言でComposeを使って w3lib.html.remove_tagsを使用して、基本的なフォーマットタグであるb、em、strong、i、brのすべてをHTMLで完全に消去します。その後、別のWebサイトに表示するために、よりクリーンでより統一されたHTMLに再構築するパイプラインを用意しました。scrapy/lxml.html:複数の連続する<br>タグを統合する

掻き崩されたHTMLの多くは、複数の連続したbrタグを持つことになります。これは、オカレンスごとに1つのbrタグにマージする必要があります。この質問に対する答えはMerge multiple <br /> tags to a single one with python lxmlですが、これは正確には達成されますが、
タグが空白で区切られていない場合に限ります。私のItemLoadersの1つが次の文字列を返したとします。

<div class="info"> <br> <br> <p class="tight"><br> Some text</p><br> <br></div> 

上記の解決策は動作しません。これらをどのように統合することが可能ですか?私はRegEx以外のソリューションを探しています。 lxmlはこれを処理できるはずですが、私はどのように把握できません。コードの下

+0

私は、任意の非正規表現溶液と思ういけないが、なぜあなたは正規表現を使用したくありませんか? – Umair

+0

downvotesの理由を知りたい。 – NFB

答えて

2

は私

from lxml import html 
data = """ 
<div class="info"> <br> <br> <br> <p class="tight"><br> Some text</p><br> <br></div> 
""" 
doc = html.fromstring(data) 
for br in doc.findall('.//br'): 
    if br.tail is None or br.tail.strip() =='': # no text immediately after <br> tag 
     for dup in br.itersiblings(): 
      if dup.tag != 'br': # don't merge if there is another tag inbetween 
       break 
      dup.drop_tag() 
      if not (dup.tail is None or dup.tail.strip() == ''): # don't merge if there is a text inbetween 
       break 

print(html.tostring(doc)) 

出力のために正常に動作します:

b'<div class="info"> <br>  <p class="tight"><br> Some text</p><br> </div>\n' 
+0

完璧な答え。シンプルなので、なぜ私はそれを考えなかったのか分かりません。ありがとうございました! – NFB

関連する問題