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

上面代码的结果正确地找到了渥太华,当使用它来查找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 回答