【问题标题】:Python web scraping with regex使用正则表达式进行 Python 网页抓取
【发布时间】:2012-10-13 20:09:07
【问题描述】:

有人可以帮助我编写一些代码来从游戏中提取统计数据吗? 我可以将 html 放入 BeautifulSoup,但我不知道如何正确格式化正则表达式以获取整个页面的特定数据位。 这是我得到的:

from urllib import urlopen
from bs4 import BeautifulSoup
import re

content = urlopen('http://www.worldoftanks.com/community/accounts/1000395103-FrankenTank').read()
soup = BeautifulSoup(content)
print soup

如果你能告诉我如何提取一个统计数据,我就能弄清楚其余的。 其中一项统计数据是参与的战斗次数(10103),编码如下:

<tr>
<td class=""> Battles Participated: </td>
<td class="td-number-nowidth"> 10 103 </td>
</tr>

谢谢!

弗兰克

【问题讨论】:

  • 正则表达式和这个有什么关系?您正在使用正确的 HTML 解析器,您不想在这里使用正则表达式..

标签: python regex web beautifulsoup scrape


【解决方案1】:

Searching the tree:

battles = soup.find('td', 'td-number-nowidth')
if battles:
   print(battles.get_text())

【讨论】:

  • 效果很好。统计数据都使用相同的“td-number-nowidth”代码重复。您建议使用什么方法迭代到该字符串的下一个实例?
  • @User: 你可以调用soup.find_all() 来获取所有结果作为一个列表。
【解决方案2】:

您要提取的数字是否包含中间的空格?如果是这样,我会做一些看起来像这样的事情:

m = re.search('class="td-number-nowidth">(\d+) (\d+)</td>', soup)
if m:
    print(m.groups())

groups() 返回一个包含“10”和“103”的字符串tuple,因此您可能需要将它们连接在一起,并将其保留为string 类型或将其解析为int 以供您使用目的。

matched = m.groups()
num = matched[0] + matched[1]
finalnumber = int(num)

【讨论】:

  • 我认为 OP 没有完全理解当你使用 BeautifulSoup(一个适当的 HTML 解析器)时不需要正则表达式。
  • 我现在看到不需要正则表达式。很酷。 Rarehunter 你的代码对我来说失败了。可能我的 2.7 版本的 python 是问题所在。谢谢大家在这里的指示。 (什么是 OP?)
  • OP 代表“原始海报”或“原始帖子”。无论如何,我忘了提及,但我在 Python v3.2 中编写了我的代码,因此版本错误可能是一个问题。谢谢你的收获!
猜你喜欢
  • 2017-02-02
  • 2020-09-28
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2013-07-30
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多