2017-02-16 8 views
0

私はHTMLファイルを解析しており、2つの文字列、つまりSent:<br>タグの間ですべてを一致させたいと考えています。私の正規表現がBeautifulSoupで動作しないのはなぜですか?

私はいくつかの非常によく似た質問を見て、それらの方法のすべてを試してみましたが、おそらく私は初心者であり、

は、ここに私の関連するコードです:

for filename in os.listdir(path): #capture email year, month, day 
    file_path = os.path.join(path, filename) 
    if os.path.isfile(file_path): 
     with open(file_path, 'r') as f: 
      html = f.read() 
      soup = BeautifulSoup(html, 'html.parser') 
      a = re.findall(r'Sent:/.+?(?=<br>)/', soup.text)[0] 
      #a = re.findall(r'Sent:(.*)', soup.text)[0] 
      print(a) 
      d = parser.parse(a) 
      print("year:", d.year) 
      print("month:", d.month) 
      print("day:", d.day) 

と私はまた私の正規表現のためにこれらを試してみた:a = re.findall(r'Sent:/^(.*?)<br>/', soup.text)[0]a = re.findall(r'Sent:/^[^<br>]*/', soup.text)[0]

しかし、私はエラーをlist index out of range得続ける....しかし、私は削除しても、 [0]私はprint(a)

の結果として印刷のみ[]と....ラインd = parser.parse(a)にエラーAttributeError: 'list' object has no attribute 'read'を取得ここではHTMLの関連するブロックです:

<b>Sent:</b> Friday, June 14, 2013 12:07 PM<br><b>To:</b> David Leveille<br><b>Subject:</b> 

答えて

1

問題はあなたの正規表現ではありませんが、BeautifulSoupがHTML(その仕事は結局のところ)を解析し、という変更をという内容にしています。たとえば、<br><br/>に変換されます。別のポイント:soup.textはすべてのタグを消去するので、あなたの正規表現はもう使えません。

それは、このスクリプトをしようとしてより明確になります。

from bs4 import * 
import re 
from dateutil import parser 

pattern = re.compile(r'Sent:(.+?)(?=<br/>)') 

with open("myfile.html", 'r') as f: 
     html = f.read() 
     print("html: ", html) 
     soup = BeautifulSoup(html, 'lxml') 
     print("soup.text: ", soup.text) 
     print("str(soup): ", str(soup)) 
     a = pattern.findall(str(soup))[0] 
     print("pattern extraction: ", a) 

第二部のために:あなたの日付文字列が(理由は初期<br/>の)正式に正しいではないので、あなたはパラメータfuzzy=Trueを追加する必要があり、そのようdocumentation of dateutilで説明されている。

d = parser.parse(a, fuzzy=True) 
print("year:", d.year) 
print("month:", d.month) 
print("day:", d.day) 

もう1つの解決策は、より正確な正規表現を使用することです。例:

pattern = re.compile(r'Sent:</b>(.+?)(?=<br/>)') 
+0

オハイオ州はかなりの意味があります。しかし、今のところ、 'd = parser.parse(a)'と 'print()'ステートメントの下にコメントが残っていますが、それでも 'ValueError:Unknown string format'というエラーで失敗しました。 – theprowler

+1

"parser.parse"の意味を理解できません。 "parser"とは何ですか?私は "dateparser"というモジュールを知っていますが、試してみるためにインストールすることはできません。 –

+0

まあ、私は 'from dateutil import parser'をインポートするように言われました....そのように私はRegExを使って' Sent: 'の後にすべてをキャプチャし、' parser() 'はその後にキャプチャされたものの中の日付を認識してキャプチャします'Sent:' ......しかし、いくつかの電子メールで何が起こっていたのか、特にこれは、\ nという文字がなかったためRegExがうんざりしていたので...私はHTMLに気付いた日付情報の末尾に「
」と書いてありましたので、私はこの質問を投稿しました....そして今、私は基本的に同じ疑問に遭いました。 – theprowler

1

あなたはその主要な用語とし、それらの間に何を探して、あなたが今受けているか、エラーがあれば教えてください以下のいずれかであなたの正規表現を交換してくださいことはできますか?

a=re.findall(r"Sent:(.*?)<br>", soup.text)[0] 
+0

「[]」と表示されるのは – theprowler

+0

です。これは、regxr.comにあります。やった。私のために働いた。この場合、問題は正規表現以外のものと思われます。 – leo

+0

これは良いニュースではありません...なぜこのように失敗するのでしょうか?このコードは別のHTMLメールではうまくいきましたが、私はこのファイルを実行しようとしましたが、これらのエラーはすべて、日付をキャプチャしようとした私の試みから現れ続けます – theprowler

1

これを試してください。 <br>タグにスラッシュが含まれているかどうかも考慮されます。

a = re.findall(r"Sent:(.*?)<br>", soup.text)[0] 

言われて、あなたはおそらく出力を確認する必要があります(または少なくとも使用時を除く/してみてください)、その値を取得しようとする前に:あなたはいつもスラッシュエスケープを必要としない

/Sent:(.*?)<\/*br>/ 
+0

印刷されたものはすべて[]でもあります:( – theprowler

1

それから。

関連する問題