Webcrawler - 检查是否<a> tag with href is within an li tag using Beautiful soup?</a>

时间:2014-04-13 19:13:55

标签: python html beautifulsoup web-crawler

我在Python中使用漂亮的汤来抓取维基百科来构建一个webcrawler。问题是维基百科有很多垃圾链接,我不想看。

例如:

在目标部分<li class="toclevel-1 tocsection-1"><a href="#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a></li>

之前使用#定位目标链接

谈话页面<li class="nv-talk"><a href="/wiki/Template_talk:Data_structures" title="Template talk:Data structures"><span title="Discuss this template" style=";;background:none transparent;border:none;;">t</span></a></li>

模板页面<li class="nv-view"><a href="/wiki/Template:Data_structures" title="Template:Data structures"><span title="View this template" style=";;background:none transparent;border:none;;">v</span></a></li>

依旧......

现在,我已将我已访问过的所有链接存储在字典中,因此我不会两次访问它们,因此我可以通过简单检查链接是否可以避免目标链接#符号已经在表格中。

但是,我在谈话,模板和其他此类网页上遇到了一些麻烦。 关于它们的独特之处在于它们总是出现在<li>标签内,具有一些类属性(&#34; nv-talk&#34;,&#34; nv-view&#34;等等),但是我的爬虫依赖于查看标记,因此我无法访问包含它的<li>标记的属性。此外,并非页面上的所有链接都包含在<li>标记中,因此我无法简单地搜索<li>标记。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用BeautifulSoup的find_parents()方法。这将告诉您特定标记是否在具有指定属性的另一个标记内。在这种情况下,我们在另一个标记中寻找具有nv-talknv-view类属性的锚标记。

演示:

html = '''<li class="nv-talk"><a href="/wiki/Template_talk:Data_structures" title="Template talk:Data structures"><span title="Discuss this    template" style=";;background:none    transparent;border:none;;">t</span></a></li>    '''
soup = BeautifulSoup(html)
a_tag = soup.find('a')
a_tag.find_parents(attrs={'class':'nv-talk'})

给你:

[<li class="nv-talk"><a href="/wiki/Template_talk:Data_structures" title="Template talk:Data    structures"><span style=";;background:none transparent;border:none;;"    title="Discuss this template">t</span></a></li>]

对于网址列表中的每个锚标记,您可以检查find_parents()是否返回空列表。如果是,则表示此链接不属于Talk或Discuss页面,因此对您的抓取安全。

解决此问题的另一种方法是查看锚标记的href属性是否以&#39; http&#39;或者&#39; https&#39;。但我不完全确定它是否符合您的代码逻辑。我的意思是,具有以href开头的#属性的锚标记是指向同一页面内各部分的链接。如果您需要忽略这些标记,则可以查找不以#开头但以httphttps开头的锚标记。这就是我的意思:

html = '''
<li class="toclevel-1 tocsection-1"><a href="#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a></li>
<li class="toclevel-1 tocsection-1"><a href="http://www.google.com"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a></li>
<li class="toclevel-1 tocsection-1"><a href="#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a></li>
'''
soup = BeautifulSoup(html)
a_tag = soup.find('a', attrs={'href': re.compile(r'^http.*')})

这只为您提供以http。

开头的链接