我一直在尝试使用BeautifulSoup来检索包含以下单词的任何格式的任何<li>
元素:Ottawa
。问题是ottawa
永远不会出现在<p>
的标签内。所以我只想打印包含li
的<{1}}元素。
HTML格式如下:
Ottawa
我的代码如下:
<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
元素。
答案 0 :(得分:3)
使用 text 属性过滤 findAll 的结果:
elems = [elem for elem in soup.findAll('li') if 'Ottawa' in str(elem.text)]
答案 1 :(得分: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'))