很抱歉,如果这个问题与其他人很相似,那么我无法使其他任何解决方案正常工作。我正在使用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>
如何获得“视图”和“互动”部分?
答案 0 :(得分:2)
您需要从注释中提取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
...
答案 1 :(得分:1)
最简单,最简单的解决方案是选择 .replace() 函数。您需要做的就是从HTML元素中踢出这个<!--
和这个-->
标志,其余的都照原样。看看下面的脚本。
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}\n{likes}')
输出:
1.56M Clicks
0
答案 2 :(得分:0)
如果只需要视图,则:
views = soup.findAll("span", {"class": "views"})
您还可以使用以下内容获取整个段落:
p = soup.findAll("p", {"class": "statistics"})
然后您可以从p中获取数据。