2016-07-03 17 views
0

我最近一直在试图从网站上获取信息,虽然我大部分都是成功的,但这已经有点困难了。试图从格式不正确的HTML网站中提取数据

我一直在目前使用正则表达式来找到一些信息(在这里,我想看看名字)

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,我我特意寻找的是以上,并不总是在相同的格式(例如,它可能不是粗体,粗体,粗体或斜体。所以我不确定用什么方法可靠地从这些信息中提取特定的统计信息。

我试图通过字体大小进行隔离,但结果的数量并不一致,并且我无法隔离我想要的特定统计信息。

+0

[除XHTML自足标签的正则表达式匹配开放标签(HTTP的可能重复://计算器.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – rohithpr

+0

不要用正则表达式解析xml/html。 – Sumurai8

回答

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 
+0

感谢您的帮助,而不是100%我特别寻找,但美丽的汤绝对看起来是更强大的工具。我通过一些澄清编辑了主要问题。 –

+0

啊我找到了解决方案。原来,我可以按字体大小进行搜索并向后计数,因为每次生成的列表的末尾都是相同的。 –