首页 > 解决方案 > 如何使用 bs4 在没有任何标签的情况下在网络上获取文本?

问题描述

这是数据结构

<div class = 'xxx' id = 'yyy'>
     <div class id = 'zzz' class = 'kkk'>
<script type = 'bbb'>
// noise word
</script>
<strong class = '111'>...</strong>
<span class = '222'>...</span>

<br>
### target data
<br>
### target data2
<br>
### target data 3

<a href="http://news.khan.co.kr/kh_cartoon/?utm_source=naver&amp;utm_medium=news_bottom_outlink" target="_blank">▶ 장도리 | 그림마당 보기</a><br/><a href="http://www.khan.co.kr/?utm_source=naver&amp;utm_medium=news_bottom_outlink" target="_blank">▶ 경향신문 바로가기&lt;/a><a href="http://smile.khan.co.kr/gudoc/gudoc_input_step3.html?media_cd=201&amp;utm_source=naver&amp;utm_medium=news_bottom_outlink" target="_blank">▶ 경향신문 구독신청하기</a><br/><br/>©경향신문(www.khan.co.kr), 무단전재 및 재배포 금지<br/><br/>
<!-- // 본문 내용 -->
</div>

... etc

我只想获取目标数据。我使用 bs4 获取 html 中的单词数据。

下面是我获取消息的源代码

soup.find_all('div',{'id':'yyy'})

但它返回了许多噪声数据。

我怎样才能只使用 bs4 和 selenium 获取目标数据?


这是目标网址,我想在文章正文中获取文字

下面是我的解析源代码

    def crwaling_article(self,url):
        """
        

        Parameters
        ----------
        url : List
            Article URL to get data.

        Returns : DataFrame
            Article Description Data Frame 
        -------
        None.

        """
        chrome_driver = webdriver.Chrome('D:/바탕 화면/인턴/python/crawling_software/crwaler/news_crwaling/chromedriver.exe')
        chrome_driver.get(url)
        html = chrome_driver.page_source
        soup = BeautifulSoup(html , 'html.parser')
        
        title = soup.find('div',{'class':'article_info'}).find('h3',{'id':'articleTitle'}).get_text()
        date = soup.find('div', {'class':'article_info'}).find('span',{'class':'t11'}).get_text()
        article = soup.find_all('div',{'id':'articleBodyContents'})

        chrome_driver.quit()
        
        self.set_title(title)
        self.set_date(date)
        

标签: pythonparsingbeautifulsoupweb-crawler

解决方案


我认为删除所有子标签会起作用。看一看:

data = """<div class='xxx' id = 'yyy'>
     <div class id = 'zzz' class='kkk'>
<script type = 'bbb'>
// noise word
</script>
<strong class = '111'>...</strong>
<span class = '222'>...</span>

<br>
### target data
<br>
### target data2
<br>
### target data 3

<a href="http://news.khan.co.kr/kh_cartoon/?utm_source=naver&amp;utm_medium=news_bottom_outlink" target="_blank">▶ 장도리 | 그림마당 보기</a><br/><a href="http://www.khan.co.kr/?utm_source=naver&amp;utm_medium=news_bottom_outlink" target="_blank">▶ 경향신문 바로가기&lt;/a><a href="http://smile.khan.co.kr/gudoc/gudoc_input_step3.html?media_cd=201&amp;utm_source=naver&amp;utm_medium=news_bottom_outlink" target="_blank">▶ 경향신문 구독신청하기</a><br/><br/>©경향신문(www.khan.co.kr), 무단전재 및 재배포 금지<br/><br/>
<!-- // 본문 내용 -->
</div>
</div>
"""
from bs4 import BeautifulSoup

if __name__ == '__main__':
    soup = BeautifulSoup(data, 'html.parser')
    for tag in soup.find('div', {'id': 'yyy'}).find_all():  # this loop delete all sub tags.
        if not tag.find_all():  # no sub tag
            tag.decompose()
    print(soup.text.strip())

输出:

### target data

### target data2

### target data 3

©경향신문(www.khan.co.kr), 무단전재 및 재배포 금지

推荐阅读