2016-10-23 4 views
2

を使用して即時レベルでテキストを抽出することができません。私は別のanswerで述べたようにfind(text=True, recursive=False)を使用することにより、タグの即時レベルからテキストを抽出するために、この方法に従ったが、u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n'のようないくつかの特定のマークアップのために、それは働いていない:はBeautifulSoup

ここで

はコードです:

markup = u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n' 
s = BeautifulSoup(markup, 'lxml') 
print s.find('p').find(text=True, recursive=False) 

そして、それは

45: u'\n' 

を印刷します私がすべての改行を取り除くとうまくいくのですが、マークアップからうまく動作しますが、HTMLファイル全体からすべての改行をランダムに削除するのは良い考えではないと思います。

他の解決方法はありますか?

+0

htmlをregexで前処理してすべての '\ n 'の先頭と末尾の文字列を見つけて削除できます –

答えて

1

findは最初の試合のみを返します。あなたはfind_allを使用する必要があります。それに

print(s.find('p').find_all(text=True, recursive=False)) 
['\n', '\n 1865\n'] 

ディールを必要として。例えば、ストリップデータと最終テキストに作品に参加:

data = s.find('p').find_all(text=True, recursive=False) 
text = ' '.join(i.strip() for i in data) 
print(text) 
1865 
0

あなたは、すべてのタグ

ためfind作業罰金が最初に正規表現を作るbs4で使用する前に、たら、あなたのマークアップを処理することができますパターン:r = re.compile('(^[\s]+)|([\s]+$)', re.MULTILINE)

先頭と末尾の空白を削除するmarkup = re.sub(r, '', markup)

第三のスペースmarkup = re.sub('\n', ' ', markup)で新しい行を置き換える

第四第五すべて一緒に入れて近くタグmarkup = re.sub('>[\s]+', '>', markup)

後の空白を削除し、オープンタグ

markup = re.sub('[\s]+<', '<', markup)前に空白を削除します。

>>> def pre_html(markup): 
     r = re.compile('(^[\s]+)|([\s]+$)', re.MULTILINE) 
     markup = re.sub(r, '', markup) 
     markup = re.sub('\n', ' ', markup) 
     markup = re.sub('[\s]+<', '<', markup) 
     markup = re.sub('>[\s]+', '>', markup) 
     return markup 


>>> markup = u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n' 
>>> pre_html(markup) 
u'<p><strong>Established</strong>1865</p>' 

あなたのコードは次のようにうまくいくはずです:

>>> markup = u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n' 
>>> soup=BeautifulSoup(pre_html(markup),"html.parser") 
>>> soup.find('p').find(text=True, recursive=False) 
u'1865'