【问题标题】:How to split scraped bad html with Python3如何使用 Python3 拆分刮掉的坏 html
【发布时间】:2020-04-06 02:21:46
【问题描述】:

下面是我用 BeautifulSoup 提取的 html 块

HTML:

<div class="adr">
                                         940 Walton Street<br/>Salt Lake City, UT 84116                                        </div>

我想拆分它的文本并将它们分配如下:

address = '940 Walton Street'
city = 'Salt Lake City'
state = 'UT'
zipcode = '84116'

到目前为止,我设法将其提取如下,但无法找到分配地址部分的方法。

第一次尝试:

print(soup.get_text(separator=" ").strip())

会给我下面的输出

940 Walton Street Salt Lake City, UT 84116

第二次尝试:

textTmp = soup.text
textStripped = re.split('"([A-Z])"', textTmp)
print('+' + textStripped[0] + '+')

给我下面的输出,(所有空格)

                                940 Walton StreetSalt Lake City, UT 84116

第三次尝试

''.join(personAddress.find('br').next_siblings)

这给了我这个输出,但不是第一部分:

Salt Lake City, UT 84116

其实这个很好,我会把它解析成城市、州和邮政编码,但是从这里我无法访问第一部分(地址部分)

我被困住了。有人可以帮我解决这个问题吗?或者至少给我一些指示? 任何帮助将不胜感激。

【问题讨论】:

    标签: python-3.x beautifulsoup python-textprocessing


    【解决方案1】:

    如果这是一个糟糕的解决方案,请原谅,我是 python 新手,从未使用过汤库,但据我所知。

    代码在哪里

    ''.join(personAddress.find('br').next_siblings)
    

    如果你将 next_siblings 替换为 previous_siblings 那么你就可以在

    所以应该是这样的

    ''.join(personAddress.find('br').previous_siblings)
    

    还可以使用 prettify() 方法清理 html 字符串

    input = """<div class="adr">
                                             940 Walton Street<br/>Salt Lake City, UT 84116                                        </div>"""
    
    soup = BeautifulSoup(input, 'html.parser')
    
    soup = BeautifulSoup(soup.prettify(), 'html.parser')
    
    

    【讨论】:

      【解决方案2】:

      您可以使用contents 并对其进行一些字符串操作。 contents[0] 是 break 标记之前的第一个文本, contents[2] 是 break 标记之后的文本。

      from bs4 import BeautifulSoup
      
      html='''<div class="adr">
                                               940 Walton Street<br/>Salt Lake City, UT 84116                                        </div>'''
      soup=BeautifulSoup(html,'html.parser')
      address=soup.select_one('.adr').contents[0].strip()
      citystatezip=soup.select_one('.adr').contents[2].strip().split(',')
      city=citystatezip[0]
      statezip=citystatezip[1].strip().split(" ")
      state=statezip[0]
      zip=statezip[1]
      
      print("address="+address,"City=" +city,"state="+state,"Zip="+zip)
      

      输出:

      address=940 Walton Street City=Salt Lake City state=UT Zip=84116
      

      可能还有一些正则表达式解决方案,但我无法弄清楚。

      【讨论】:

      • 在下面查看我的答案。
      • @αԋɱҽԃαмєяιcαη:那不是regex解决方案。那只是字符串操作:)
      • 如果我们有非常简单的方法,就不需要正则表达式。
      【解决方案3】:
      from bs4 import BeautifulSoup
      
      data = """
      <div class="adr">
                                               940 Walton Street<br/>Salt Lake City, UT 84116                                        </div>
      """
      
      soup = BeautifulSoup(data, 'html.parser')
      
      for item in soup.findAll('div', {'class': 'adr'}):
          item = item.get_text(",", strip=True).split(',')
          item.extend(item.pop(-1).strip().split())
          print("Address: {}\nCity: {}\nState: {}\nZip: {}".format(
              item[0], item[1], item[2], item[3]))
      

      输出:

      Address: 940 Walton Street
      City: Salt Lake City
      State: UT
      Zip: 84116
      

      【讨论】:

        【解决方案4】:

        这是一个正则表达式+简化的scrapy解决方案

        import re
        from simplified_scrapy.simplified_doc import SimplifiedDoc 
        html='''<div class="adr">940 Walton Street<br/>Salt Lake City, UT 84116</div>
        '''
        doc = SimplifiedDoc(html)
        div = doc.getElement('div',attr='class',value='adr') # obtain the DIV
        
        items = re.split('<br\s*/>|,',div.html) # use regex split innerHtml
        cz =items[2].strip().split(' ')
        print ("Address: {}\nCity: {}\nState: {}\nZip: {}".format(items[0],items[1],cz[0],cz[1]))
        

        【讨论】:

          猜你喜欢
          • 2020-01-27
          • 1970-01-01
          • 2018-05-22
          • 2016-07-23
          • 2022-07-20
          • 1970-01-01
          • 2021-08-01
          • 1970-01-01
          • 2019-06-04
          相关资源
          最近更新 更多