【问题标题】:Python Web scraping with Beautiful Soup 3: how to get text from divPython Web 抓取与 Beautiful Soup 3:如何从 div 获取文本
【发布时间】:2017-09-19 19:39:02
【问题描述】:

这是我遇到问题的 HTML 的样子,

<div id="id" class="class">

 text

</div>

假设我有一个变量,里面有汤,

div = find('div', attrs={'class': 'class'})

如何获取 div 的文本部分?

我已经分别尝试了其中一些方法。

text = div.get_text()
text = div.string
text = div.text

当我跑步时

type(div) 

它是 BeautifulSoup.Tag 类型,但是当我调用上述任何方法时,它会说“NoneType”没有任何这些属性。

我可以把它拉出来

和其他属性,只是不是 div。

我查看了有关 BeautifulSoup 的其他几个问题,但没有一个解决这个问题。

【问题讨论】:

    标签: html python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    我不太确定问题出在哪里,但这里有一个工作示例:

    from bs4 import BeautifulSoup
    html = """
    <div id="id" class="class">
    
     text
    
    </div>
    """
    soup = BeautifulSoup(html, 'html.parser')
    div = soup.find('div', attrs={'class': 'class'})
    print (type(div.text))
    print (div.text)
    

    输出:

    <type 'unicode'>
    
     text
    

    【讨论】:

    • 是的 .text 仍然无法正常工作,但我可以使用 div.__str__ 的等效项并编辑 div 标签
    • 你能更新到 BS4 吗? BS3 的所有开发都已停止,该版本的最后一个版本是 2 多年前
    • 我会安装它并试一试。谢谢
    【解决方案2】:

    我认为您的代码没有任何问题。如果方法返回 None 是因为 BeautifulSoup 的 find 函数没有找到标签和/或属性。以下是一些建议:

    • 尝试使用函数find_all() 而不是只使用find()(它将返回一个列表)
    • 确保类 class 在标签 div
    • 尝试在 BeautifulSoup 中使用不同的库,例如“lxml”、“html5lib”等
    • 如果可能,请使用 Python 3 尝试相同的代码

    这是我测试过并且运行良好的代码:

    from bs4 import BeautifulSoup as bs
    
    html = '<div id="id" class="class">exemple_text</div>'
    
    div = bs(html, 'html5lib')
    
    answer = div.find('div', attrs={'class': 'class'})
    
    print(answer.text)
    

    【讨论】:

    • .text 不起作用,但我可以使用 .__str__ 并使用字符串操作来摆脱 div 标签
    • 是的!我总是使用.__str__ 和正则表达式来解决 BeautifulSoup 效率不高的问题。唯一的问题是正则表达式操作起来并不那么简单。
    【解决方案3】:

    您是否尝试从元素中提取文本?试试这个:

    html='''
    <div id="id" class="class">
     text
    </div>
    '''
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,"lxml")
    item = soup.find(id="id").text.strip()
    item1 = soup.find("div").text.strip()
    item2 = soup.find(class_="class").text.strip()
    print(item,item1,item2)
    

    所有这些都给你相同的结果:

    text text text
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多