2

このhtmlコードがあるとしましょう:

<table id="test_table">
    <td>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
    </td>
</table>
<table id="test_table2">
    <td>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
    </td>
</table>

#test_table のみで href を照合して繰り返し処理したいですか? 私はこのようなことを試しました:

<table id="test_table">\s*<td>(\s*<a href="(?P<url>.*?)">(?P<anchor>.*?)</a>\n)*

しかし、これは最初の要素にしか一致しません。これで数時間立ち往生していて、うまくいきません。助けてくれてありがとう。

4

4 に答える 4

3

HTML の場合は、適切なツールを使用してください。代わりに、BeautifulSoupなどの HTML パーサーを使用します。

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)

table = soup.find('table', id='test_table')
for anchor in table.find_all('a'):
    print anchor['href'], anchor.string

正規表現を使用しないでください。HTML とそのような表現との照合は複雑になりすぎ、高速になりすぎます。そうしないでください。

于 2013-03-28T15:57:47.653 に答える
1

HTML の解析に正規表現を使用しないでください。これには LXML を使用してください。

iPython を使用した例 (テストはファイルです)

In [55]: import lxml.html

In [56]: x = lxml.html.fromstring(open("test").read())

In [57]: for i in x.iterlinks():
    print i # print ALL links 
   ....:     
(<Element a at 0x1bb7110>, 'href', '#', 0)
(<Element a at 0x1ba8c50>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)
(<Element a at 0x1ba8e30>, 'href', '#', 0)
(<Element a at 0x1ba8c50>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)
(<Element a at 0x1ba8e30>, 'href', '#', 0)
(<Element a at 0x1ba8c50>, 'href', '#', 0)
(<Element a at 0x1bb7110>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)
(<Element a at 0x1ba8c50>, 'href', '#', 0)
(<Element a at 0x1ba8e30>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)
(<Element a at 0x1ba8c50>, 'href', '#', 0)
(<Element a at 0x1ba8e30>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)

In [58]: path = x.xpath("./table[@id='test_table']")[0]

In [59]: for i in path.iterlinks():
   ....:     print i
   ....:     
(<Element a at 0x1bb7110>, 'href', '#', 0)
(<Element a at 0x1bb7050>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)
(<Element a at 0x1ba8e30>, 'href', '#', 0)
(<Element a at 0x1bb7050>, 'href', '#', 0)
(<Element a at 0x1ba89b0>, 'href', '#', 0)
(<Element a at 0x1ba8e30>, 'href', '#', 0)
(<Element a at 0x1bb7050>, 'href', '#', 0)

Xpathを使用すると、物事がはるかに簡単になり、頭痛とコーヒーが減ります;)

于 2013-03-28T16:04:21.160 に答える
0

PyQueryも見てください。私はそれが提供する jQuery の親しみやすさが気に入っています。

>>> from pyquery import PyQuery as pq
>>> html = '''<table id="test_table">
...     <td>
...         <a href="#">#</a>
...         <a href="#">#</a>
...         <a href="#">#</a>
...         <a href="#">#</a>
...         <a href="#">#</a>
...         <a href="#">#</a>
...         <a href="#">#</a>
...         <a href="#">#</a>
...     </td>
... </table>
... <table id="test_table2">
...     <td>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...         <a href="#">#33</a>
...     </td>
... </table>'''
>>> d = pq(html)
>>> for a in d('#test_table').find('a'):
...     print a.attrib.items()
...
...
[('href', '#')]
[('href', '#')]
[('href', '#')]
[('href', '#')]
[('href', '#')]
[('href', '#')]
[('href', '#')]
[('href', '#')]
于 2013-03-28T16:40:48.580 に答える
0

正規表現、HTML の正しい部分をキャプチャします。

問題は、+ または * で終わるキャプチャ グループがある場合 (たとえば、((?P<anchor>.*?)*)、groups()メソッドによって最後のグループのみが返されることです。

例えば:

sss='''<table id="test_table">
    <td>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#">#</a>
        <a href="#last_url">#last_anch</a>
    </td>
</table>
<table id="test_table2">
    <td>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
        <a href="#">#33</a>
    </td>
</table>'''

import re

res='<table id="test_table">\s*<td>(\s*<a href="(?P<url>.*?)">(?P<anchor>.*?)</a>\n)*'
m=re.search(res,sss)
print m.groups()

出力:

('        <a href="#last_url">#last_anch</a>\n', '#last_url', '#last_ach')

BeautifulSoup のような専用の HTML プロセッサを常に使用する必要があるという他の投稿者には同意しません。これらはオーバーヘッドが高くなる可能性があり、簡単なタスクの場合、コーディングに時間がかかる可能性があります。

別の方法は、以下のように 2 つの re を使用することです。

res='<table id="test_table">.*?</table>'
mm=re.search(res,sss,re.DOTALL)
results=[m.group('url','anchor') for m in re.finditer('<a href="(?P<url>.*?)">(?P<anchor>.*?)</a>',mm.group())]
于 2013-03-28T16:51:24.433 に答える