gpt4 book ai didi

python - Webcrawler - 使用 Beautiful soup 检查带有 href 的 标签是否在 li 标签内?

转载 作者:行者123 更新时间:2023-12-01 05:16:43 25 4
gpt4 key购买 nike

我正在用 Python 构建一个网络爬虫,使用 beautiful soup 来抓取维基百科。问题是维基百科有很多我不想看的垃圾链接。

例如:

目标链接为#在目标部分之前

<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> 中标签,具有一些类属性( "nv-talk""nv-view" 等),但是我的爬虫依赖于查看 <a>标签,所以我无权访问 <li> 的属性包含它的标签。

此外,并非页面上的所有链接都包含在 <li> 中。标签,所以我不能简单地搜索 <li>标签代替。

有什么想法吗?

最佳答案

您可以使用find_parents() BeautifulSoup 的方法。这将告诉您特定标签是否位于具有指定属性的另一个标签内。在本例中,我们正在另一个具有 nv-talknv-view 类属性的标签中查找 anchor 标签。

演示:

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>]

对于网址列表中的每个 anchor 标记,您可以检查 find_parents() 是否返回空列表。如果是,则意味着该链接不属于“讨论”或“讨论”页面,因此您的抓取是安全的。

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

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 开头的链接。

关于python - Webcrawler - 使用 Beautiful soup 检查带有 href 的 <a> 标签是否在 li 标签内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com