【问题标题】:BeautifulSoup: findAll doesn't find the tagsBeautifulSoup:findAll 找不到标签
【发布时间】:2016-08-19 00:29:47
【问题描述】:

对于我发布的许多问题,我很抱歉,但我不知道如何处理这个错误:在测试这个 page 时,使用简单的 ps

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 代码看起来很正常)?

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案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
    

    您可以看到 html5liblxml 获取所有 p 标签,但标准 html.parser 也不处理损坏的 html。通过validator.w3 运行文章 html 会得到很多输出,尤其是:

    【讨论】:

    • 谢谢!但是为什么会这样,当我在单独的article_body html 上同时使用html.parserlxml 时,每种情况下我只得到14 个psoup3=BeautifulSoup(article_body, "html.parser")le(soup3.findAll("p"))(len 是14),soup4=BeautifulSoup(article_body, "lxml")len(soup4.findAll("p"))(也有 14 个)。是不是和我在主<html>标签上使用lxml,搜索article,然后搜索article找到p时一样吗?结果也应该是 26。 article_bodyhtml 我通过了元素检查器。
    【解决方案2】:

    您的代码只给出一个 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,根据你当前的代码是正确的

    【讨论】:

    • 问题出在 html 中,它在水下之后出现了额外的 "" 标签,当我查看它观察到的源代码时,看到这是 html 源 {
    猜你喜欢
    • 2020-06-04
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多