iT邦幫忙

0

遇到很多層的css標籤

遇到一個網頁碼長類似這樣

  <article id="article-main-contents">
   <span style="color: #424242">
    <span style="font-family:webfont">
     <span style="color: #e82a1f">
      <span style="font-family:webfont">
      </span>
     </span>
    </span>
   </span>
   <br/>
   <span style="color: #424242">
    <span style="font-family:webfont">
     <span style="color: #e82a1f">
      <span style="font-family:webfont">
       這是我要的內容
      </span>
     </span>
    </span>
   </span>
  </article>

用soup.select("span")捕捉
想打印內容會出現很多行 這是我要的內容
這要怎麼解決

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
listennn08
iT邦高手 5 級 ‧ 2020-10-11 00:10:52
最佳解答
soup.select('span[style="font-family:webfont"]')[3].text.strip()
看更多先前的回應...收起先前的回應...
s4028600 iT邦新手 5 級 ‧ 2020-10-11 07:25:52 檢舉

這是可以捕捉這一個
但是其他類似的就沒辦法了
網址
https://www.lightnovel.us/detail/1034901

你是打算抓什麼
全部內文嗎?
提供一個簡單的方法

filter_texts=[]
for text in soup.select('span[style="font-family:webfont"]'):
  if text.text.strip() not in filter_texts:
    filter_texts.append(text.text.strip())
    print(text.text.strip())
s4028600 iT邦新手 5 級 ‧ 2020-10-11 17:34:43 檢舉

利用出現過就排除的方式?
看來沒辦法精確捕捉,只能捕捉後處理了…

不知道為什麼你這方法還是會有重複的

不知道為什麼你這方法還是會有重複的

我看了一下他的 html
這有可能是用 markdown 轉的 要取得你想取得的會很複雜
如果只要全部內文為何不抓 article 就好了

s4028600 iT邦新手 5 級 ‧ 2020-10-11 19:32:18 檢舉

原因目前有兩個
一會抓到不想抓的(確認可用soup.select("article")[1]解決)
二抓下來的字全部擠在一起…目前想不出方法,所以改抓span

分三個區塊抓

span = soup.select('span[style="color: #424242"] > span[style="font-family:webfont"]')
span += soup.select('span[style="color: #424242"] > span[style="font-size:large"] >  span[style="font-family:webfont"] > span[style="font-size:large"] > span[style="font-size:large"] > span[style="font-family:webfont"]')
span += soup.select('span[style="font-size:large"] > span[style="font-size:small"] > span[style="font-family:webfont"]')
for s in span:
  print(s.text.strip())

# result:
# 动画符合以下条件进行发帖,均会给予轻币奖励

# ①有封面
# ②有所属合集:合集教程(可以向我或其它管理申请将‘同部作品的其它话’放到该合集里)
# ③发布(有汉化组授权)或转载(无汉化组授权)
# 奖励:①发布每帖300轻币  ②转载每帖50轻币 ③长期稳定发布可以获得对应勋章
# 其它要求:
# ①内容都应遵照资讯区置顶版规的规定发布,且必须上传与内容相符合的封面
# ②帖子不得有重复,对严重违反者处以扣除轻币和小黑屋等处罚
# ③发帖完成后需在本贴评论区回复‘帖子的ID’(参考:资讯区),以方便审核奖励发放的资格

# PS:另动画转载区招只版主
# 福利如下:①每月固定轻币工资 ②特殊勋章
# 负责 :①日常发放奖励 ②活跃板块
s4028600 iT邦新手 5 級 ‧ 2020-10-12 09:08:36 檢舉

看來想抓類似的必須對標籤很熟了...
感謝建議

s4028600 iT邦新手 5 級 ‧ 2020-10-13 18:51:14 檢舉

你是不是有改良答案……?

想問個相關問題
一般print(soup.text)能夠取得所有「標籤」的「內容」
那bs4有可能取得「標籤」本身嗎?

我那天就改過了耶
soup.select 就是取得標籤本身
像是如果你用迴圈去跑 不加 text 出來就是整個標籤

s4028600 iT邦新手 5 級 ‧ 2020-10-13 22:24:30 檢舉

不是,我的意思是只有標籤,沒有內容
比如

<title>內容</title>
<a>我不要</a>
打印出來變
<title></title><a></a>
或<title><a>

這樣沒有內容
想問bs4能辦到嗎?
看它的函數都沒辦法

只要標籤的話要用 name

html_doc="""<title>內容</title>
<a>我不要</a>
打印出來變
<title></title><a></a>
或<title><a>"""
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.select('title')[0].name) # title
s4028600 iT邦新手 5 級 ‧ 2020-10-13 23:04:17 檢舉

可惜,那看起來是沒辦法了
雖然這樣可以抓到標籤,但前提是知道標籤名稱,我想一次打印全部的不知名標籤……
因為我目前的工具只剩手機的python
想看網頁的內碼找標籤很困難,如果網頁小還可以慢慢找
但網頁一大就沒法找了
目前只好捕捉後再處理了
感謝

你可以抓父層然後抓所有子層標籤 不過這樣要用 find
e.g

for children in soup.find('article').findChildren():
    print(children.name)

我要發表回答

立即登入回答