在 <pre> 标记内分隔文本

Posted

技术标签:

【中文标题】在 <pre> 标记内分隔文本【英文标题】:Separating text inside a <pre> tag 【发布时间】: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>

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

谢谢

【问题讨论】:

【参考方案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 例程中以保留行尾,如果这是您想要的。

【讨论】:

以上是关于在 <pre> 标记内分隔文本的主要内容,如果未能解决你的问题,请参考以下文章

LI 元素的文本分隔符

数据文件的内容中,字段中间用制表符Tab键分隔。

文本编辑器分隔线号重叠和长线标记

使用正则表达式替换 Pre 标记内的 Html

如何修改特定分隔符之间的文本(在文件中)? [关闭]

在 MVC 5 中,返回具有指定名称的视图是在 <pre> 标记内返回整个页面