【问题标题】:Separating text inside a <pre> tag在 <pre> 标记内分隔文本
【发布时间】:2019-06-02 03:27:26
【问题描述】:

我想尝试一些基本的网络抓取,但遇到了一个问题,因为我习惯了简单的 td-tags,在这种情况下,我有一个网页,其中包含以下 pre-tag 和其中的所有文本,这意味着刮起来有点麻烦。

<pre style="word-wrap: break-word; white-space: pre-wrap;">
11111111
11111112
11111113
11111114
11111115
</pre>

关于如何抓取每一行的任何建议?

谢谢

【问题讨论】:

    标签: python beautifulsoup screen-scraping


    【解决方案1】:

    如果这正是您想要解析的内容,您可以使用splitlines() 函数轻松获取行列表,或者您可以像这样调整split() 函数。

    from bs4 import BeautifulSoup
    
    content = """
    <pre style="word-wrap: break-word; white-space: pre-wrap;">
    11111111 
    11111112 
    11111113
    11111114
    11111115 
    </pre>""" # This is your content
    
    soup = BeautifulSoup(content, "html.parser")
    stuff = soup.find('pre').text
    lines = stuff.split("\n") # or replace this by stuff.splitlines()
    # print(lines) gives ["11111111", "11111112", "11111113", "11111114", "11111115"]
    for line in lines:
        print(line)
    # prints each row separately.
    

    【讨论】:

    • 谢谢,但是如果有 5000 行呢?在代码中包含 HTML 内容并不是一个可靠的解决方案。下面是一个例子,退出地址:check.torproject.org/exit-addresses
    • 至于你给出的例子,没有HTML内容,它只是纯文本。他们的bs4在那里毫无用处。因此,在这种情况下,您将搜索特定的重复字符串序列并相应地使用split()。在你的情况下,ExitNode 这个词是唯一重复的,所以你会做s.split('ExitNode')
    【解决方案2】:

    如果每一行确实是单独一行,为什么不把内容拆分成一个列表呢?

    data = soup.find('pre').text
    lines = data.splitlines()
    

    您可以将True 传递到splitlines 例程中以保留行尾,如果这是您想要的。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2011-07-19
      相关资源
      最近更新 更多