0

Pythonで正規表現を使用してHTMLからデータを抽出しています。私が書いた正規表現は次のようなものです。

result = re.findall(r'<td align="left"  csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+|<td align="lef(.*?)" >(.*?)</td>\s+', webpage)

これがいずれかの形式に従うtdになると仮定します-

<td align="left"  csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+

また

<td align="lef(.*?)" >(.*?)</td>

これは、tdがその特定のセルで異なる形式をとることができるためです(リンクのあるデータがあるか、データがまったくない場合もあります)。

私が使用したOR条件は正しくないと思います。ORは、2つのtdタグ全体ではなく、「ちょうど」前の正規表現と「ちょうど」後の正規表現にのみ一致すると考えています。

私の質問は、ORがtdタグ全体で一致するように、どのようにグループ化するか(たとえば、paranthesisを使用)です。

4

2 に答える 2

3

正規表現を使用していますが、XMLとそのような式の照合は複雑すぎ、速すぎます。

代わりにHTMLパーサーを使用してください。Pythonには次の選択肢があります。

  • ElementTreeは標準ライブラリの一部です
  • BeautifulSoupは人気のサードパーティライブラリです
  • lxmlは、高速で機能豊富なCベースのライブラリです。

ElementTreeの例:

from xml.etree import ElementTree

tree = ElementTree.parse('filename.html')
for elem in tree.findall('tr'):
    print ElementTree.tostring(elem)
于 2012-09-10T15:07:59.973 に答える
0

をに置き換える必要があり<td align="left" csk="(\d\d\d\d)\d\d\d\d"><a href=.?*>(.*?)</a></td>\s+ます。.?*.*?

そして、あなたの質問に答えるために、次のように非キャプチャ グループ化を使用して、必要なことを行うことができます。

(?:first_regex)|(?:second_regex)

ところで。に置き換えることもできます。読みやすい\d\d\d\d\d{4}思います。

于 2012-09-10T15:41:01.200 に答える