【问题标题】:How to find all repeat pattern and capture the sub-pattern in python?如何在python中找到所有重复模式并捕获子模式?
【发布时间】:2013-12-28 17:00:25
【问题描述】:

我尝试从网页中抓取一些数据,一些行如下所示

<td><a href="some_web_site">Mr. Google</a></td>
<td>12.42%</td>
<td>1360</td>
<td><span style="color: #E3170D">49.12%</span></td>
<td><span style="color: #008000">2.513</span></td>
<td><span style="color: #E3170D">0.945</span></td>
<td>5.074</td>
<td>5.371</td>
<td>8.424</td>
</tr>

当然,每一行的末尾都有一个\n。 我尝试在我的数据矩阵中获取“Mr. Google”这个名字以及数据作为一行。 (还有其他数据是来自同一网页的其他行) 似乎很难同时匹配所有这些。我能弄清楚的唯一方法是:

pattern=re.complie(r'>([\w\s]*)</a></td>\n
                     (?:<td>([\d\.\%]*)</td>\n){2} 
                     (?:.*>([\d\.\%]*)</span></td>\n){3}
                     (?:<td>([\d\.]*)</td>\n){3}')

不幸的是,它只匹配最后一个,即“谷歌先生”,1360,0.945,8.424,而不是所有数据。我应该多次重复该模式而不是使用 {2} 或 {3} 吗? 也许重复可以解决它,但真的很难看。:( 我想知道是否有人可以帮助我摆脱这种重新模式。

另一种选择是使用不同的简单模式分别获取名称和数据。 问题是网页中还有其他一些单独的数据,所以我不想将这个“名称数据”行与单独的数据混合。我别无选择,只能一次性获取名称和数据,以便确保获得所需的正确数据。

谢谢。

【问题讨论】:

  • 不要使用正则表达式解析 HTML,你只会发现麻烦。改为查看 HTML 解析库,例如 BeautifulSoup.
  • 添加到 kroolik 的评论中,使用 BeautifulSoup 您可以使用类似单个 td 的方式获取列表本身中的名称数据。 td_tags = soup.find('tr').find_all('td'); info = [tag.text for tag in td_tags];更干净更简单

标签: python regex


【解决方案1】:

下面的正则表达式正在寻找 > 和 之间的任何可见字符(不是空格,不是换行符)

data = re.findall('>\s*([^<\n\r]+)\s*<', html)
print data

这仅适用于您作为示例提供的示例字符串。

【讨论】:

  • 谢谢,但是真实网页在>和
  • 那么你必须使用Beautifulsoup 进行 HTML 解析。或者你仍然可以使用REGEX,但是会更笨拙。
  • 没错。感谢您的所有建议。现在我正在学习 Beautifulsoup。:)
【解决方案2】:

更好地使用 xpath:

import requests
import urllib2
from lxml import html
url = 'HTTP'

page = requests.get(url)
tree = html.fromstring(page.text)

a = tree.xpath('//td/a/text()|//td/text()')
b = tree.xpath('//td/span/text()') 

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2016-04-05
    • 1970-01-01
    • 2013-04-23
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多