BeautifulSoup没有提取特定的标签文本

时间:2017-04-24 16:35:33

标签: python web-scraping beautifulsoup

我在使用BeautifulSoup收集特定标签的信息时遇到了问题。我想提取项目4'的文本。标签html之间,但下面的代码获取与项目1相关的文本。'我做错了什么(例如,切片)?

代码:

primary_detail = page_section.findAll('div', {'class': 'detail-item'})
for item_4 in page_section.find('h3', string='Item 4'):
  if item_4:
    for item_4_content in page_section.find('html'):
      print (item_4_content)

HTML:

<div class="detail-item">
   <h3>Item 1</h3>
   <html><body><p>Item 1 text here</p></body></html>
</div>

<div class="detail-item">
   <h3>Item 2</h3>
   <html><body><p>Item 2 text here</p></body></html>
</div>

<div class="detail-item">
   <h3>Item 3</h3>
   <html><body><p>Item 3 text here</p></body></html>
</div>

<div class="detail-item">
   <h3>Item 4</h3>
   <html><body><p>Item 4 text here</p></body></html>
</div>

1 个答案:

答案 0 :(得分:2)

看起来您想根据<p>文字值打印<h3>代码内容,对吗?

您的代码必须:

  1. 加载html_source
  2. 搜索包含'div'等于'class'
  3. 的所有'detail-item'代码 如果.text标记的<h3>值等于字符串'Item 4' ,则每次出现
  4. 然后代码将print相应.text代码的<p>
  5. 您可以使用以下代码实现所需目的。

    <强>代码:

    s = '''<div class="detail-item">
       <h3>Item 1</h3>
       <html><body><p>Item 1 text here</p></body></html>
    </div>
    
    <div class="detail-item">
       <h3>Item 2</h3>
       <html><body><p>Item 2 text here</p></body></html>
    </div>
    
    <div class="detail-item">
       <h3>Item 3</h3>
       <html><body><p>Item 3 text here</p></body></html>
    </div>
    
    <div class="detail-item">
       <h3>Item 4</h3>
       <html><body><p>Item 4 text here</p></body></html>
    </div>'''
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(s, 'lxml')
    
    primary_detail = soup.find_all('div', {'class': 'detail-item'})
    
    for tag in primary_detail:
        if 'Item 4' in tag.h3.text:
            print(tag.p.text)
    

    <强>输出:

    'Item 4 text here'
    

    编辑https://tex.stackexchange.com/questions/134191/line-breaks-of-long-urls-in-biblatex-bibliography第一次循环中没有<h3>标记,只有<h2>所以它不会有任何.text {1}}值,对吗?

    您可以使用try/except子句绕过此错误,如下面的代码所示。

    <强>代码:

    from bs4 import BeautifulSoup
    import requests
    
    
    url = 'https://fortiguard.com/psirt/FG-IR-17-097'
    html_source = requests.get(url).text
    
    soup = BeautifulSoup(html_source, 'lxml')
    
    primary_detail = soup.find_all('div', {'class': 'detail-item'})
    
    for tag in primary_detail:
        try:
            if 'Solutions' in tag.h3.text:
                print(tag.p.text)
        except:
            continue
    

    如果代码面临异常,它将继续迭代循环中的下一个元素。因此,代码将忽略不包含任何.text值的第一个项目。

    <强>输出:

    'Upgrade to FortiWLC-SD version 8.3.0'