BeautifulSoup 从评论 html 中提取文本 [重复]

Posted

技术标签:

【中文标题】BeautifulSoup 从评论 html 中提取文本 [重复]【英文标题】:BeautifulSoup extract text from comment html [duplicate] 【发布时间】:2019-03-11 18:14:33 【问题描述】:

抱歉,如果这个问题对其他人来说很相似,我无法使任何其他解决方案发挥作用。我正在使用beautifulsoup 抓取一个网站,并试图从一个已评论的表字段中获取信息:

<td>
    <span class="release" data-release="1518739200"></span>
    <!--<p class="statistics">

                      <span class="views" clicks="1564058">1.56M Clicks</span>

                        <span class="interaction" likes="0"></span>

    </p>-->
</td>

如何获得部分“视图”和“交互”?

【问题讨论】:

试试soup.select('span[class="views"])(和interaction分别) @DušanMaďar 我试过这些,但我得到了AttributeError: 'Comment' object has no attribute 'decompose'comments.extract() 它可以工作但没有提供任何结果 @MCO soup.select('span[class="views"]') 为我提供了以下空结果 [] ,但不确定您的意思是“分别与交互”是什么意思? @Claudine 尝试使用extract:***.com/a/33139332/4183498 @DušanMaďar 看到我试错了,但很遗憾,摘录没有提供任何结果 【参考方案1】:

您需要从评论中提取 html 并使用 BeautifulSoup 再次解析,如下所示:

from bs4 import BeautifulSoup, Comment
html = """<td>
    <span class="release" data-release="1518739200"></span>
    <!--<p class="statistics">

                      <span class="views" clicks="1564058">1.56M Clicks</span>

                        <span class="interaction" likes="0"></span>

    </p>-->
</td>"""
soup = BeautifulSoup(html , 'lxml')
comment = soup.find(text=lambda text:isinstance(text, Comment))
commentsoup = BeautifulSoup(comment , 'lxml')
views = commentsoup.find('span', 'class': 'views')
interaction= commentsoup.find('span', 'class': 'interaction')
print (views.get_text(), interaction['likes'])

输出:

156 万次点击 0

如果评论不是页面上的第一个评论,您需要像这样对其进行索引:

comment = soup.find_all(text=lambda text:isinstance(text, Comment))[1]

或从父元素中找到它。

根据评论更新:

您可以为此使用父 'tr' 元素。您提供的页面有“共享”而不是“交互”,所以我希望您有一个 NoneType 对象,它给了您看到的错误。如果需要,您可以在代码中为 NoneType 对象添加测试。

from bs4 import BeautifulSoup, Comment
import requests
url = "https://imvdb.com/calendar/2018?page=1"
html = requests.get(url).text
soup = BeautifulSoup(html , 'lxml')

for tr in soup.find_all('tr'):
    comment = tr.find(text=lambda text:isinstance(text, Comment))
    commentsoup = BeautifulSoup(comment , 'lxml')
    views = commentsoup.find('span', 'class': 'views')
    shares= commentsoup.find('span', 'class': 'shares')
    print (views.get_text(), shares['data-shares'])

输出:

3.60K Views 0
1.56M Views 0
220.28K Views 0
6.09M Views 0
133.04K Views 0
163.62M Views 0
30.44K Views 0
2.95M Views 0
2.10M Views 0
83.21K Views 0
5.27K Views 0
...

【讨论】:

在这种情况下我应该输入什么html = ?我有不止一个表,每一行都有一个评论值。这就是我如何找到注释 table = soup.find('table','class':'contentTable') for tr in table.find_all('tr'): comment_section = tr.find_all('td')[2] print(comment_section) 的代码位置,然后它在第一篇文章中向我输出代码。如果我尝试做html = comment_section' it doesnt work NoneType 对象不可调用` 你能发个网址吗? 找到了!非常感谢您的帮助:) 还有一个后续问题:它卡在commentsoup 返回一个TypeError expected string or bytes-like object 你能发个网址吗?还是完整的 HTML 源代码的链接?【参考方案2】:

最简单的解决方案是选择 .replace() 函数。您需要做的就是从 html 元素中剔除这个&lt;!-- 和这个--&gt; 标志,其余的保持原样。看看下面的脚本。

from bs4 import BeautifulSoup

htdoc = """
<td>
    <span class="release" data-release="1518739200"></span>
    <!--<p class="statistics">
        <span class="views" clicks="1564058">1.56M Clicks</span>
        <span class="interaction" likes="0"></span>
    </p>-->
</td>
"""
elem = htdoc.replace("<!--","").replace("-->","")
soup = BeautifulSoup(elem,'lxml')
views = soup.select_one('span.views').get_text(strip=True)
likes = soup.select_one('span.interaction')['likes']
print(f'views\nlikes')

输出:

1.56M Clicks
0

【讨论】:

【参考方案3】:

如果您只想要视图,那么:

views = soup.findAll("span", "class": "views")

您还可以通过以下方式获取整个段落:

p = soup.findAll("p", "class": "statistics")

然后就可以从p中获取数据了。

【讨论】:

不幸的是这不起作用,它给了我以下输出[]

以上是关于BeautifulSoup 从评论 html 中提取文本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

网页上可以看到评论,但是 BeautifulSoup 返回的 html 对象不包含评论部分

用beautifulsoup4从天才网站上抓取评论

当我在 html 中遇到评论时,如何停止使用 Beautifulsoup 提取 href 标签?

使用 BeautifulSoup 在评论标签中抓取表格

如何使用 BeautifulSoup 找到评论标签 <!--...-->?

使用 Selenium 时不完整的 BeautifulSoup 刮擦