【问题标题】:Beautiful Soup and extracting a div and its contents by IDBeautiful Soup 并通过 ID 提取 div 及其内容
【发布时间】:2011-01-09 07:49:30
【问题描述】:
soup.find("tagName", { "id" : "articlebody" })

为什么这不返回 <div id="articlebody"> ... </div> 标签和介于两者之间的东西?它什么也不返回。我知道它的存在是因为我正从

soup.prettify()

soup.find("div", { "id" : "articlebody" }) 也不起作用。

编辑:我发现 BeautifulSoup 没有正确解析我的页面,这可能意味着我尝试解析的页面在 SGML 或其他格式中的格式不正确)

【问题讨论】:

  • (对于您的编辑,即使解析器在您的特定页面上不起作用,这个问题仍然对其他人具有可重用资源的价值)

标签: python beautifulsoup


【解决方案1】:

您应该发布您的示例文档,因为代码可以正常工作:

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

&lt;div&gt;s 中查找&lt;div&gt;s 也可以:

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

【讨论】:

  • 我的示例文档非常庞大。我正在追查问题 - 我认为这不适用于 div 的 div。我用 print len(soup('div')) 计算了文档中有多少 div,结果为 10,我可以清楚地看到 10 多个带有 firebug 的 div。所以我认为它只是无法在 div 中找到 div,所以我需要逐个包装器缩小包装器的范围。
  • 好吧,那你的问题就没法回答了,水晶球不是一种可靠的调试方式。 :)
  • 我试过这段代码。 div 有 并且我无法在其中打印嵌入。
  • soup.find('div', id='articlebody')
【解决方案2】:

通过id查找元素:

div = soup.find(id="articlebody")

【讨论】:

    【解决方案3】:

    美汤4支持大多数CSS selectors.select() method,因此您可以使用id selector,例如:

    soup.select('#articlebody')
    

    如果需要指定元素的类型,可以在id选择器前添加type selector

    soup.select('div#articlebody')
    

    .select() 方法将返回一个元素集合,这意味着它将返回与以下 .find_all() method 示例相同的结果:

    soup.find_all('div', id="articlebody")
    # or
    soup.find_all(id="articlebody")
    

    如果你只想选择一个元素,那么你可以使用.find() method

    soup.find('div', id="articlebody")
    # or
    soup.find(id="articlebody")
    

    【讨论】:

      【解决方案4】:

      我认为'div'标签嵌套过多时会出现问题。我正在尝试从 facebook html 文件中解析一些联系人,而 Beautifulsoup 无法找到带有“fcontent”类的标签“div”。

      这也发生在其他类中。一般来说,当我搜索 div 时,它只会搜索那些没有那么多嵌套的 div。

      html 源代码可以是您朋友(不是您的一个朋友)的朋友列表中来自 facebook 的任何页面。如果有人可以对其进行测试并提供一些建议,我将不胜感激。

      这是我的代码,我只是尝试用“fcontent”类打印标签“div”的数量:

      from BeautifulSoup import BeautifulSoup 
      f = open('/Users/myUserName/Desktop/contacts.html')
      soup = BeautifulSoup(f) 
      list = soup.findAll('div', attrs={'class':'fcontent'})
      print len(list)
      

      【讨论】:

        【解决方案5】:

        很可能是因为默认的beautifulsoup 解析器有问题。更改其他解析器,例如“lxml”,然后重试。

        【讨论】:

        • 这对我有用,谢谢!我用soup = BeautifulSoup(data, parser="html.parser")
        【解决方案6】:

        在beautifulsoup 源代码中,这一行允许div 嵌套在div 中;所以你对 lukas 评论的担忧是无效的。

        NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']
        

        我认为你需要做的是指定你想要的属性,例如

        source.find('div', attrs={'id':'articlebody'})
        

        【讨论】:

          【解决方案7】:

          你试过soup.findAll("div", {"id": "articlebody"})吗?

          听起来很疯狂,但如果你从野外抓取东西,你不能排除多个 div...

          【讨论】:

            【解决方案8】:

            我用过:

            soup.findAll('tag', attrs={'attrname':"attrvalue"})
            

            作为我查找/查找的语法;也就是说,除非标签和属性列表之间还有其他可选参数,否则这应该没有什么不同。

            【讨论】:

              【解决方案9】:

              这是一个代码片段

              soup = BeautifulSoup(:"index.html")
              titleList = soup.findAll('title')
              divList = soup.findAll('div', attrs={ "class" : "article story"})
              

              如您所见,我找到了所有标签,然后我找到了所有带有 class="article" 的标签

              【讨论】:

                【解决方案10】:

                我在尝试抓取 Google 时也发生了这种情况。
                我最终使用了 pyquery。
                安装:

                pip install pyquery
                

                用途:

                from pyquery import PyQuery    
                pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
                tag = pq('div#articlebody')
                

                【讨论】:

                  【解决方案11】:

                  Id 属性始终是唯一标识的。这意味着您可以直接使用它,甚至无需指定元素。因此,如果您的元素可以解析内容,那将是一个加分项。

                  divEle = soup.find(id = "articlebody")
                  

                  【讨论】:

                    【解决方案12】:
                    from bs4 import BeautifulSoup
                    from requests_html import HTMLSession
                    
                    url = 'your_url'
                    session = HTMLSession()
                    resp = session.get(url)
                    
                    # if element with id "articlebody" is dynamic, else need not to render
                    resp.html.render()
                    
                    soup = bs(resp.html.html, "lxml")
                    soup.find("div", {"id": "articlebody"})
                    

                    【讨论】:

                      【解决方案13】:
                      soup.find("tagName",attrs={ "id" : "articlebody" })
                      

                      【讨论】:

                      • 为您的答案提供更多解释
                      • 欢迎来到 Stack Overflow。虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 How to Answer
                      • 错误答案:TypeError: find() takes no keyword arguments
                      猜你喜欢
                      • 2020-09-03
                      • 1970-01-01
                      • 2014-06-11
                      • 2019-09-01
                      • 2018-12-11
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-01-31
                      • 2020-05-04
                      相关资源
                      最近更新 更多