试图从格式不佳的HTML网站中提取数据

时间:2016-07-03 14:54:09

标签: python html regex html-parsing pull

我最近一直试图从网站上获取信息,虽然我大部分时间都取得了成功,但这有点困难。

我一直在使用正则表达式来查找一些信息(这里是我要查看的名称)

webAddress = 'http://meridian.puzzlepirates.com/yoweb/crew/info.wm?crewid=' + str(crewid)
htmlFile = urllib.urlopen(webAddress)
htmlText = htmlFile.read()

regex = 'classic&target=(.+?)">'
pattern = re.compile(regex)
checkMatch = re.findall(pattern,htmlText)
像这样。当该特定行上有一致的指示符时,该工作正常。但是我现在有一个问题,我的指标不在那一行。

 <td width="28" height="28"><a href="/ratings/top_5_0.html"><img 
  src="/yoweb/images/stat-5.png" width="28" height="28" border="0"
  alt="Gunning"></a></td>
<td align="left">
  <font size="-1">
      <i><b>Exalted</b></i>/<b>Master</b>
  </font>

特别是要把第二行拉到最后一行,但是这个倒数第二行可能没有粗体或斜体/没有相同的单词,所以我的指标必须是“Gunning”,因为那样是我关心的具体领域。不幸的是,它甚至不总是在每个不同页面的同一行上,所以我不能只看一个特定的行来尝试找到它。任何建议都会很棒!

修改

我已经开始尝试学习/使用美丽的汤(感谢你指点我的方向。

我一开始并不像我想要的那样明确,所以让我试着澄清一下。

专门尝试从this

这样的网页中提取排名
 <td width="28" height="28"><a href="/ratings/top_5_0.html"><img 
  src="/yoweb/images/stat-5.png" width="28" height="28" border="0"
  alt="Gunning"></a></td>
<td align="left">
  <font size="-1">
      <i><b>Exalted</b></i>/<b>Master</b>
  </font>

我专门寻找的部分的HTML在上面,并不总是在相同的格式(例如,它可以是非粗体,粗体,或粗体和斜体。所以不确定我用什么方法可以用来从该信息中可靠地提取特定的统计数据。

我尝试通过字体大小进行隔离,但结果数量不一致,我无法隔离我想要的特定属性。

1 个答案:

答案 0 :(得分:2)

标记绝对不容易处理,但你绝对是should not be approaching it with regular expressions不要使用工具只是因为您熟悉它或者您对它很好。使用最适合特定情况的工具。

在这种情况下,您需要 HTML解析器,例如BeautifulSoup

假设您要提取名称(主要工作人员表中以粗体显示的名称):

>>> import requests
>>> from bs4 import BeautifulSoup
>>> url = "http://meridian.puzzlepirates.com/yoweb/crew/info.wm?crewid=5002373"
>>> 
>>> response = requests.get(url)
>>> 
>>> soup = BeautifulSoup(response.content, "html.parser")
>>> table = soup.find('table', width='330')  # relying on width, yeah, does not look reliable
>>> for b in table.find_all('b'):
...     print(b.get_text(strip=True))
... 
Captain
Senior Officer
Fleet Officer
Officer
Pirate
Cabin Person
Jobbing Pirate