2012-05-03 8 views
2

Ottawaの形式を含む<li>要素を取得するためにBeautifulSoupを使用しようとしています。問題は、ottawaが、<p>のような自分自身のタグ内に決して存在しないことです。だからOttawaを含むliの要素だけを印刷したい。BeautifulSoupを使用して文字列に基づいてli要素を抽出する

HTMLの書式は次のようである:

<html> 
<body> 
<blockquote> 
<ul><li><a href="http://link.com"><b>name</b></a> 
(National: Ottawa, ON) 
<blockquote> some description </blockquote></li> 
<li><a href="http://link2.com"><b>name</b></a> 
(National: Vancouver, BC) 
<blockquote> some description </blockquote></li> 
<li><a href="http://link3.com"><b>name</b></a> 
(Local: Ottawa, ON) 
<blockquote> some description </blockquote></li> 
</ul> 
</blockquote> 
</body> 
</html> 

次のように私のコードは次のとおりです。

from bs4 import BeautifulSoup 
import re 
import urllib2,sys 

url = "http://www.charityvillage.ca/cv/nonpr/nonpr1.html" 
html = urllib2.urlopen(url).read() 
soup = BeautifulSoup(html) 

re1='.*?' 
re2='(Ottawa)' 
ottawa = soup.findAll(text=re.compile(re1+re2,re.IGNORECASE|re.DOTALL)) 
search = soup.findAll('li') 

上記のコードの結果が正しくオタワを見つけ、li要素を見つけるためにそれを使用した場合それはli要素を見つけるが、それは私にページ上のすべてのものを与える。

私は私の最終目標は、Ottawaの一切の言及を含むすべての<li>要素を取得し、私と全体<li>要素を与える基本的に、彼らは[]

search = soup.findAll('li', text=re.compile(re1+re2,re.IGNORECASE|re.DOTALL))結果をやろうとしているとして、一緒に現在はないことを理解しますなどの名前、説明、リンク、

答えて

2
from bs4 import BeautifulSoup 
import re 
import urllib2,sys 

url = "http://www.charityvillage.ca/cv/nonpr/nonpr1.html" 
html = urllib2.urlopen(url).read() 
soup = BeautifulSoup(html) 

for item in soup.find_all(text=re.compile('\(.+: Ottawa', re.IGNORECASE)): 
    link = item.find_previous_sibling(lambda tag: tag.has_key('href')) 
    if link is None: 
     continue 
    print(u'{} [{}]: {}'.format(link.text, 
           item.strip(), 
           link['href']).encode('utf8')) 
+0

@ thiago-m私はあなたがそれに助けが必要かどうかを教えてください、あなたが一致したいパターンを正確にはわかりません。 「ローカル(オタワ)」ではなく、「(Regional | Local | National):オタワ」というだけかもしれませんか? "\(。*:Ottawa \)" – KurzedMetal

+1

@ thiago-m正規表現を改善しようとしたところ、いくつかのノードが同じ構造に従わず、アンカーがいくつかあることがわかりました。実際のリンクと構造体に従わない項目をスキップするだけです。GL – KurzedMetal

+0

私は 'local'部分を削除し、必要な部分のほとんどを取り出しました。私は十分に検索したので、私は約20ページを掻いていたので、リストは巨大です。 – paradd0x

3

のfindAllの結果をフィルタリングするテキスト属性を使用します。

`はAttributeError: 'リスト' オブジェクトは、これを使用した後に何の属性「text'`を持っていません:` elemsは= [検索中のelemのためのelem場合str内のオタワ(search.text)] `
elems = [elem for elem in soup.findAll('li') if 'Ottawa' in str(elem.text)] 
+0

は、残念ながら、私はこれを得ました – paradd0x

関連する問題