【问题标题】:Removing tags when using Beautifulsoup使用 Beautifulsoup 时删除标签
【发布时间】:2018-02-28 12:49:40
【问题描述】:

试图在 Kodi 中为个人脚本抓取网站,我的代码正在运行,但是当 BS 呈现内容时,它仍然有标签。 Reletavily 是 Python 的新手,所以请寻找易于理解的答案。

当前输出:

<li>
  <span style="font-family:trebuchet ms,helvetica,sans-serif;">
    <span style="font-size:16px;color:#EFEFEF;">
      04:30 - 05:30 The Tonight Show Starring Jimmy Fallon
      <span style="color:#999999;">
        - Channel 34
      </span>
    </span>
  </span>
</li>

想要的输出:

04:30 - 05:30 The Tonight Show Starring Jimmy Fallon - Channel 34

我的代码:

import xbmcgui
import xbmcaddon
import urllib, urllib2, re, HTMLParser, os
from bs4 import BeautifulSoup

pg_source = ''
req = urllib2.Request('http://rushmore.tv/schedule')
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')

try:
    response = urllib2.urlopen(req)
    pg_source = response.read().decode('utf-8' , 'ignore')
    response.close()
except:
    pass

content = []
soup = BeautifulSoup(pg_source)
content = BeautifulSoup(soup.find('ul', { 'id' : 'myUL' }).prettify())

xbmcgui.Dialog().textviewer(str(content), str(content))
xbmcgui.Window

谢谢。

【问题讨论】:

  • 你试过xpath 吗?
  • 我没有试过 xpath 没有。你能详细说明一下吗?
  • 只是提取prettify不做的文本内容。
  • https://stackoverflow.com/questions/8692/how-to-use-xpath-in-python/13504511 这里是一个如何使用它的例子。您可以将它与lxml 或纯python 一起使用import xpath
  • @KeyurPotdar 抱歉还在学习,谢谢。

标签: python html beautifulsoup kodi


【解决方案1】:

这可能会有所帮助。我正在使用find_next 方法来获取第二个跨度

from bs4 import BeautifulSoup

d = """<li>
<span style="font-family:trebuchet ms,helvetica,sans-serif;">
<span style="font-size:16px;color:#EFEFEF;">
04:30 - 05:30 The Tonight Show Starring Jimmy Fallon
<span style="color:#999999;">
- Channel 34
</span>
</span>
</span>
</li>"""
soup = BeautifulSoup(d, "html.parser")
print soup.find("li").span.find_next('span').get_text()
#or
print soup.find("li").find("span", {"style": "font-size:16px;color:#EFEFEF;"}).text

输出:

04:30 - 05:30 The Tonight Show Starring Jimmy Fallon - Channel 34

【讨论】:

  • 这看起来像是我可以使用的东西。我怎么能在我的代码中实现它?我试过 get_text 但它返回了这个错误,我不知道如何纠正它。错误内容:“ascii”编解码器无法解码位置 4210 中的字节 0xc3:序数不在范围内(128)
  • 该错误看起来像是您的文本中有非英文字符
  • 有没有办法绕过它?我正在抓取的文本在网站上并且每天都在更改,因此在抓取之前我无法更改它。如果这是有道理的。顺便说一句,谢谢
  • 尝试 response.read().encode('utf-8').decode('ascii', 'ignore')
【解决方案2】:

试试下面的方法。它应该会给你想要的结果。

import requests
from bs4 import BeautifulSoup

res = requests.get("http://rushmore.tv/schedule")
soup = BeautifulSoup(res.text,"lxml")
for content in soup.select("#myUL span[style*='#EFEFEF']"):
    print(content.text)

部分输出:

16:00 - 20:00 Tennis: ATP Dubai  - 13 (720P / US) & 21 (720P / CA)
16:00 - 20:00 Tennis: ATP Dubai  - 13 (720P / US)
17:00 - 21:00 Golic and Wingo - Channel 03
18:45 - 23:00 Snooker: Welsh Open - Channel 105
20:00 - 23:30 The Dan Patrick Show - Channel 11

【讨论】:

  • 太好了,谢谢,但是使用它时出现缩进错误。 Python 正常运行,但 Kodi 没有。我做错什么了吗?
  • 抱歉,我已经解决了。是我的错。只需“找不到具有您要求的功能的树生成器:lxml。”可能是 Kodi 错误。我会尽力解决这个问题,谢谢。
  • 尝试将此行从 BeautifulSoup(res.text,"lxml") 更改为 BeautifulSoup(res.text,"html.parser")。希望它能解决问题。顺便说一句,因为它解决了问题,请确保通过勾选我的答案旁边的灰色复选标记来接受它作为答案。谢谢。
  • 这似乎解决了这个问题,但现在我又遇到了 ascii 错误,这是否表明我正在抓取的网站有问题? - 错误内容:'ascii' 编解码器无法对位置 54 中的字符 u'\xe1' 进行编码:序数不在范围内(128)
  • 好的,虽然这可行,但它每次都会刮掉每个单独的元素,而不是全部刮掉。明白了吗?
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2014-10-02
  • 2013-10-19
  • 1970-01-01
  • 2020-02-26
  • 2019-05-11
相关资源
最近更新 更多