2011-03-17 19 views
1

我目前正在學習Python,我試圖做一個小刮板,但我遇到了美麗的湯和正則表達式的問題。與正則表達式匹配的問題

我想匹配具有以下HTML網站的所有鏈接:

<td> 
    <a href="/l1234/Place+Number+1">Place Number 1 </a> 
</td> 
<td width="100"> 
    California </td> 
<td> 
    <a href="/l2342/Place+Number+2">Place Number 2 </a> 
</td> 
<td width="100"> 
    Florida </td> 

我想所有的以下鏈接:「/ LXXXX /地點+數字+ X」

我使用Python和beautifulsoup此:

import BeautifulSoup 
import urllib2 
import re 

address = 'http://www.example.com' 

html = urllib2.urlopen(address).read() 

soup = BeautifulSoup(html) 

for tag in soup.findAll('a', id = re.compile('l[0-9]*')): 
    print tag['href'] 

在soup.findAll正則表達式部分,我對一些示例代碼中發現,因爲我似乎無法從beautifulSoup文件到W獲得的例子ork.With沒有正則表達式的一部分,我得到了頁面上的所有鏈接,但我只想要「lxxx」的

我做錯了我的正則表達式?也許有一種方法可以在正則表達式中做到這一點,但我似乎無法找到方法。

+1

你在哪裏看到的id = LXXX?這是關於href! – dfens 2011-03-17 16:13:06

+1

感謝您使用html解析器,上帝創造了一隻小貓,當他看到您的帖子時。嘗試匹配的HREF不ID! – austinbv 2011-03-17 16:18:16

+0

啊,是的,我不確定我發現的代碼示例中的那個部分。謝謝! – user664698 2011-03-17 16:25:18

回答

2

我建議

for tag in soup.findAll('a', href = re.compile('^/l[0-9]+/.*$')): 
    print tag['href'] 

爲尋找像避免標籤,但不完全是你是什麼樣子

+0

太棒了,過濾了以前的正則表達式匹配的其他鏈接。現在我只需要真正理解正則表達式hehe。 – user664698 2011-03-17 16:38:56

4

難道你不應該試圖做href的正則表達式匹配,而不是id

for tag in soup.findAll('a', href = re.compile('l[0-9]*')): 
    print tag['href'] 
+0

嗯,是的,我不確定我發現的代碼示例中的那個部分,BSoup文檔對此不太清楚。但它現在也匹配這些鏈接:listado.php?mrdstartid = 20&alpha = yes&l = A(爲什麼我不能在回覆框中輸入換行符?我按回車併發布回覆!) – user664698 2011-03-17 16:27:03

+0

@ user664698:IIRC Shift - 輸入將在評論中做你想要的。 – hardmath 2011-03-17 17:14:44

+0

@user你不能在評論中做新行,如果你把'*'改成'+',它需要在正則表達式中'l'後面的數字 – 2011-03-17 18:34:16

1

除了檢查HREF沒有ID

re.compile(r'^\/l[0-9]{4}/Place\+Number\+[0-9]+') 

比賽似乎假定你的正則表達式以 「^」 開始。

>>> m = re.compile(r"abc") 
>>> m.match("eabc") 
>>> m.match("abcd") 
<_sre.SRE_Match object at 0x7f23192318b8> 

因此,添加\ /允許第一個斜線匹配。另外,我使用{4}來匹配四個數字,而不是匹配零個或多個數字的*。

>>> m = re.compile(r'\/l[0-9]*') 
>>> m.match("/longurl/somewhere") 
<_sre.SRE_Match object at 0x7f2319231850> 
+0

是的,{4}肯定比*好。您也可以使用\ d而不是[0-9]。 – Emmanuel 2011-03-18 08:47:40