- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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-talk
或 nv-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 标记是指向同一页面内部分的链接。如果您需要忽略这些,您可以查找不以 #
开头、而是以 http
或 https
开头的 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/
我想编写一个网络爬虫,它从一个页面开始,然后转到该页面上的每个链接来查找电子邮件地址。这是我到目前为止所做的,但除了从一个网页到另一个网页之外,它没有做任何事情。 `package com.netin
所以我正在开发一个网络爬虫,它应该下载所有图像、文件和网页,然后递归地对找到的所有网页执行相同的操作。不过我好像有逻辑错误。 public class WebCrawler { priv
我用 Node.JS 编写了这个 WebCrawler。它抓取页面并将其保存到 Redis 中。我使用 setImmediate 和 process.nextTick,但它仍然抛出此错误。我做错了什么
是否可以将参数传递给 WebCrawler ?例如,我想在运行时为 WebCrawler.shouldVisit(WebURL url) 方法传递新规则,或者在我的 WebCrawler 中设置一些字
嗨,我想试着编程一个爬行器。。我从一个非常简单的代码开始,但当我执行它时,我已经收到了一条错误消息。。代码出了什么问题?。我认为这个错误是从源头开始的。。我很清楚,他拿不到那一页,但我不明白为什么。以
我正在尝试为最新版本的 plone (4.2.x) 安装 funnelweb 插件。我已经在 3 台不同的计算机上尝试过,并且在所有计算机上都出现了同样的错误。错误粘贴在下面: magiq@magiq
我正在使用 http://code.google.com/p/crawler4j/ 中的一些爬虫代码. 现在,我想做的是从另一个类访问 MyCrawler 类中找到的每个 URL。 我启动爬虫: //
我已经阅读了 concurrency in practice(Limitations of shutdownNow) 中的 7.2.5 章节 shutdown的问题 现在它只返回未启动的任务。 首先我
我从 rNomads 包中取出以下代码并对其进行了一些修改。 最初运行它时我得到: > WebCrawler(url = "www.bikeforums.net") [1] "www.bikeforu
我正在尝试从网站上运行简单的 Jaunt 示例,但出现空指针异常错误。我不确定该怎么做,因为在 Android Studio 中很少支持使用 Jaunt。这是我的代码: public class Ma
我有一个程序可以检查网页上是否有关键字。但是在检查了 1000-3000 个 url 之后,它挂起了。没有输出,不退出,tcp连接数为零。我不知道为什么没有新的连接。 你能给我一些调试建议吗? typ
我正在用 Python 构建一个网络爬虫,使用 beautiful soup 来抓取维基百科。问题是维基百科有很多我不想看的垃圾链接。 例如: 目标链接为#在目标部分之前 1
我是一名优秀的程序员,十分优秀!