2

BeautifulSoup を使用して<li>、次の単語の任意の形式を含む要素を取得しようとしています: Ottawa. 問題は、ottawaなどの独自のタグ内にないこと<p>です。liだから私は含む要素だけを印刷したいOttawa.

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')

上記のコードの結果は、Ottawa を正しく検出し、それを使用してli要素を検索すると、要素は検出liされますが、ページ上のすべての要素が表示されます。

私は、それらが現在連携していないことを理解していsearch = soup.findAll('li', text=re.compile(re1+re2,re.IGNORECASE|re.DOTALL))ます.[]

私の最終目標は、基本的に<li>、言及を含むすべての要素を取得し、名前、説明、リンクなどを含む要素Ottawa全体を提供することです。<li>

4

2 に答える 2

3

text属性を使用して、 findAllの結果をフィルタリングします。

elems = [elem for elem in soup.findAll('li') if 'Ottawa' in str(elem.text)]
于 2012-05-03T20:25:55.943 に答える
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'))
于 2012-05-04T12:15:41.090 に答える