对于我发布的许多问题,我很抱歉,但我不知道如何处理此错误:使用简单p
s
ab=soup.find("article", {"itemprop":"articleBody"})
p=ab.findAll("p")
print(len(p)) #gives 1
有很多p
个标签,但我只得到第一个。
我尝试将整个<article itemprop="articleBody">
html文本复制粘贴到字符串中,并将其传递给新的BeautifulSoup
对象。在p
中搜索该对象会给出所有需要的标签(14)。
为什么通常的方法不起作用?这里是否动态加载了p
标签(但是html代码看起来很正常)?
答案 0 :(得分:1)
你的代码只给了一个p,因为当你解析汤并试图查看它解析的内容时,它只获得一个段落 见下面的代码
ab = soup.find("article", {"itemprop": "articleBody"})
print ab
输出
<article class="content link-underline relative body-copy" data-js="content" itemprop="articleBody">
<p>Not every update about a superhero movie is worthy of great attention. Take, for example, <a href="http://www.slashfilm.com/aquaman-setting/">the revelation</a> that not all of <em>Aquaman</em> will take place underwater</p></article>
因为您正在查找文章标签下的项目并且汤在找到结束文章标签时关闭搜索,因此它返回1作为按照当前代码正确的p的len
答案 1 :(得分:1)
问题是解析器:
In [21]: req = requests.get("http://www.wired.com/2016/08/cape-watch-99/")
In [22]: soup = BeautifulSoup(req.content, "lxml")
In [23]: len(soup.select("article[itemprop=articleBody] p"))
Out[23]: 26
In [24]: soup = BeautifulSoup(req.content, "html.parser")
In [25]: len(soup.select("article[itemprop=articleBody] p"))
Out[25]: 1
In [26]: soup = BeautifulSoup(req.content, "html5lib")
In [27]: len(soup.select("article[itemprop=articleBody] p"))
Out[27]: 26
您可以看到 html5lib 和 lxml 获取所有p标签,但标准 html.parser 也不能处理损坏的html。通过validator.w3运行文章html会得到很多输出,特别是: