遇到一個網頁碼長類似這樣
<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")捕捉
想打印內容會出現很多行 這是我要的內容
這要怎麼解決
soup.select('span[style="font-family:webfont"]')[3].text.strip()
這是可以捕捉這一個
但是其他類似的就沒辦法了
網址
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())
利用出現過就排除的方式?
看來沒辦法精確捕捉,只能捕捉後處理了…
不知道為什麼你這方法還是會有重複的
不知道為什麼你這方法還是會有重複的
我看了一下他的 html
這有可能是用 markdown 轉的 要取得你想取得的會很複雜
如果只要全部內文為何不抓 article 就好了
原因目前有兩個
一會抓到不想抓的(確認可用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:另动画转载区招只版主
# 福利如下:①每月固定轻币工资 ②特殊勋章
# 负责 :①日常发放奖励 ②活跃板块
看來想抓類似的必須對標籤很熟了...
感謝建議
你是不是有改良答案……?
想問個相關問題
一般print(soup.text)能夠取得所有「標籤」的「內容」
那bs4有可能取得「標籤」本身嗎?
我那天就改過了耶
soup.select 就是取得標籤本身
像是如果你用迴圈去跑 不加 text 出來就是整個標籤
不是,我的意思是只有標籤,沒有內容
比如
<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
可惜,那看起來是沒辦法了
雖然這樣可以抓到標籤,但前提是知道標籤名稱,我想一次打印全部的不知名標籤……
因為我目前的工具只剩手機的python
想看網頁的內碼找標籤很困難,如果網頁小還可以慢慢找
但網頁一大就沒法找了
目前只好捕捉後再處理了
感謝
你可以抓父層然後抓所有子層標籤 不過這樣要用 find
e.g
for children in soup.find('article').findChildren():
print(children.name)