2016-07-03 14 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

啊我找到了解決方案。原來,我可以按字體大小進行搜索並向後計數,因爲每次生成的列表的末尾都是相同的。 –