【问题标题】:how can i get text on web without any tag using bs4?如何使用 bs4 在没有任何标签的情况下在网络上获取文本?
【发布时间】:2020-10-14 06:02:34
【问题描述】:

这是数据结构

<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">▶ 경향신문 바로가기</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 获取目标数据??


this is target url and i wanna get text in article body

下面是我的解析源代码

    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)
        

【问题讨论】:

  • 你的目标是什么?
  • 真正的文字是什么而不是target data
  • 我无法上传那个。我想是因为它太复杂了。所以我的详细问题是如何在### targetdata 获取数据。究竟如何才能在
    只有文本中获取数据?
  • @YangDongJae 在目标数据中有任何标签还是纯文本?
  • 您提供的html不完整。它只包含开始标签。关闭标签在哪里?

标签: python parsing beautifulsoup web-crawler


【解决方案1】:

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

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">▶ 경향신문 바로가기</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), 무단전재 및 재배포 금지

【讨论】:

  • 你能给我一些关于我的更新问题的建议吗?我想得到这篇文章。但是当我关注你的源代码时,我得到了页面中的所有文本。我该如何解决这个问题?
  • 看看 MendelG 的回答。看起来就是答案。
【解决方案2】:

由于 HTML 不完整,很难提出干净的解决方案,但这可以给你一个想法:你可以.extract() 不必要的标签,只留下想要的数据:

from bs4 import BeautifulSoup


txt = '''<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">▶ 경향신문 바로가기</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>'''


soup = BeautifulSoup(txt, 'html.parser')

div = soup.select_one('#yyy')

# remove all non-necessary tags
div.select_one('script').extract()
div.find('strong', class_='111').extract()
div.find('span', class_='222').extract()

for t in div.a.next_siblings:  # remove all tags after <a>
    t.extract()

div.a.extract()  # remove <a> itself

print(div.prettify())

打印:

<div class="xxx" id="yyy">
 <div class="kkk" id="zzz">
  <br/>
  ### target data
  <br/>
  ### target data2
  <br/>
  ### target data 3
 </div>
</div>

【讨论】:

    【解决方案3】:

    您可以使用多个 CSS 选择器来抓取正确的数据:

    from time import sleep
    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    
    URL = "https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=100&sid2=264&oid=016&aid=0001737526"
    
    driver = webdriver.Chrome()
    driver.get(URL)
    sleep(5)
    
    soup = BeautifulSoup(driver.page_source, "html.parser")
    
    for tags1, tags2 in zip(
        soup.select(
            "#articleBodyContents > br:nth-child(5), br:nth-child(7), br:nth-child(9)"
        ),
        soup.select("#articleBodyContents > span:nth-child(10)"),
    ):
        print(tags1.next)
        print(tags2.next.next)
    

    输出:

    [헤럴드경제=강문규 기자] 문재인 대통령은 14일 라임·옵티머스 사건과 관련해 청와대 참... And on
    

    【讨论】:

    • 我认为这是一个很好的解决方案。但它不适合我的项目。因为我必须实施以获取所有具有不同 css 结构的文章。不过还是谢谢
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签