1

したがって、一致するものが1行を超えない限り、データの抽出に大きな成功を収めました。複数の行をまたぐ場合は、(一見)胸焼けがあります...ここにHTMLデータのスニペットがあります私は得る:

<tr>
<td width=20%>3 month
<td width=1% class=bar>
&nbsp;
<td width=1% nowrap class="value chg">+10.03%
<td width=54% class=bar>
<table width=100% cellpadding=0 cellspacing=0 class=barChart>
<tr>

「+10.03%」という数字が気になり、

<td width=20%>3 month

「+10.03%」が欲しいということを教えてくれるパターンです。

だから私はこれまでPythonでこれを持っています:

percent = re.search('<td width=20%>3 month\r\n<td width=1% class=bar>\r\n&nbsp;\r\n<td width=1% nowrap class="value chg">(.*?)', content)

変数 content には、検索しているすべての html コードが含まれています。これは私にはうまくいかないようです...アドバイスをいただければ幸いです!re.compile() と re.multiline() について話している他のいくつかの投稿を読みましたが、それらがどのように機能するか理解していないため、ほとんど運がありません...

4

2 に答える 2

0

ご協力ありがとうございました!あなたは私を正しい方向に向けてくれました。コードを BeautifulSoup で動作させる方法は次のとおりです。必要なすべてのデータが「value chg」と呼ばれるクラスの下にあり、その後にデータが常にその検索の 3 番目と 5 番目の要素であることに気付きました。

from BeautifulSoup import BeautifulSoup
import urllib

content = urllib.urlopen(url).read()
soup = BeautifulSoup(''.join(content))

td_list = soup.findAll('td', {'class':'value chg'} )

mon3 = td_list[2].text.encode('ascii','ignore')
yr1 = td_list[4].text.encode('ascii','ignore')

繰り返しますが、「コンテンツ」はダウンロードした HTML です。

于 2013-10-09T07:15:12.803 に答える
0

「複数行」正規表現スイッチを追加する必要があります(?m)findallを使用して、一致の最初の要素を取得して、ターゲットコンテンツを直接抽出できますfindall(regex, content)[0]

percent = re.findall(r'(?m)<td width=20%>3 month\s*<td width=1% class=bar>\s*&nbsp;\s*<td width=1% nowrap class="value chg">(\S+)', content)[0]

を使用\s*して改行を一致させることにより、正規表現は UNIX と Windows の両方のスタイルの行末記号と互換性があります。


次のテスト コードのライブ デモを参照してください。

import re
content = '<tr>\n<td width=20%>3 month\n<td width=1% class=bar>\n&nbsp;\n<td width=1% nowrap class="value chg">+10.03%\n<td width=54% class=bar>\n<table width=100% cellpadding=0 cellspacing=0 class=barChart>\n<tr>'        
percent = re.findall(r'(?m)<td width=20%>3 month\s*<td width=1% class=bar>\s*&nbsp;\s*<td width=1% nowrap class="value chg">(\S+)', content)[0]
print(percent)

出力:

+10.03%
于 2013-10-09T13:38:19.117 に答える