【发布时间】:2016-08-07 18:34:54
【问题描述】:
我正在尝试从wired.com 获取文章。 一般他们的文章内容是这样的:
<article itemprop="articleBody">
<p>Some text</p>
<p>Next text</p>
<p>...</p>
<p>...</p>
</article>
或者像这样:
<article itemprop="articleBody">
<div class="listicle-captions marg-t...">
<p></p>
</div>
</article>
所以我想要如果页面是类型 1,则提取 <p> 和 <h>,而如果页面是类型 2 - 执行其他操作。所以,如果<p> 和<h> 是<article> 的直接后代,那么它就是类型1。
我尝试了以下代码,它查找<p> 和<h> 并打印出标签名称。问题是,recursive="False" 似乎没有帮助,因为在类型 2 页面上进行测试时,它找到了标签,而它不应该找到标签(我预计会得到一个 NonType 对象)。
import urllib.request
from bs4 import BeautifulSoup
import datetime
import html
import sys
articleUrl="https://www.wired.com/2016/07/greatest-feats-inventions-100-years-boeing/"
soupArticle=BeautifulSoup(urllib.request.urlopen(articleUrl), "html.parser")
articleBody=soupArticle.find("article", {"itemprop":"articleBody"})
articleContentTags=articleBody.findAll(["h1", "h2","h3", "p"], recursive="False")
for tag in articleContentTags:
print(tag.name)
print(tag.parent.encode("utf-8"))
为什么它不起作用?
PS 另外,在一般情况下使用findAll 和findChildren 和在这种特殊情况下有区别吗?这两个在我看来是一样的..
【问题讨论】:
标签: python web-scraping beautifulsoup