【问题标题】:Python splitting to the newline characterPython拆分为换行符
【发布时间】:2013-01-25 21:36:39
【问题描述】:

我有一个 html 文件,我正在检索文本的正文

我想打印一行

现在我正在打印

for line in newName.body(text=True):
    print line

这给了我身体里的一切 我想要的是像打印一样

for line in newName.body(text=True):
    print line[257:_____] # this is where i need help

而不是 __ 或选择另一个数字来结束我希望它转到换行符 所以看起来像

for line in newName.body(text=True):
    print line[257:'\n'] 

然而,这种剂量是有效的 我怎样才能做到这一点?

我正在处理的文本位于 身体 预 我想要的文字 /前 /正文

【问题讨论】:

  • “我想打印一行” print newName.body(text=True)[257] 是否按预期工作?
  • 不,这会产生错误“列表索引超出范围”
  • 贴错了错误信息正确的是“ValueError: substring not found”
  • 您确定使用正则表达式不会提供更好的解决方案吗?看起来您正在获取 HTML 文档的正文文本并尝试从 127 个字符直到 '\n' - 当然,这些文本位实际上是文档结构的一部分,这意味着 Xpath 或类似将是一个更好的选择 - 也许您可以提供您尝试提取的 HTML 页面的 sn-p。
  • @sotapme 代码类似于 '
     cptn cheesebox loves cerial 
    ' 这些都是单独的行,但我无法弄清楚如何让它看起来像代码

标签: python string split beautifulsoup urllib2


【解决方案1】:

您可以使用.partition() method 获取第一行:

first_line = newName.body.getText().partition("\n")[0]

假设 newName 是一个 BeautifulSoup 对象。它通常被命名为soup

从 html 中的第一个 <pre> 标签获取文本:

text = soup.pre.string

获取文本中的行列表:

list_of_lines = text.splitlines()

如果你想在文本中保留行尾标记:

list_of_lines = text.splitlines(True)

从列表中获取第 i 行:

ith_line = list_of_lines[i]

注意:从零开始的索引,例如,i = 2 对应于第 3 行。

【讨论】:

  • 这会产生错误“AttributeError: 'NoneType' object has no attribute 'partition'”
  • @MysterMyster:试试.getText()。它也应该适用于旧的BeautifulSoup 版本。
  • 并产生 IndexError: tuple index out of range
  • 好的,所以现在如果我执行 first_line = newName.body.getText().partition('\n')[2] 它会像以前一样返回第 257 行的所有文本,但现在打印 first_line [257:]
  • @MysterMyster: .partition() 返回 3 元组。总是。您无法使用我的答案中的代码获得 IndexError 。如果要获取行列表,可以使用.splitlines()。但是使用行号从 html 中提取内容是非常脆弱的。 Update your question 包含您在要提取的文本周围看到的 html 标记。
【解决方案2】:

无法保证您的 HTML 文件不止一行。网页可以排成一行,但页面的结构不必与标记的结构相匹配,反之亦然。

为了确定,试试这个:

打印 len(newName.body(text=True).split('\n'))

如果值>1,那么你应该能够得到你需要的行:

newName.body(text=True).split('\n')[257]

也许不是最优雅的方式,但它确实有效,如果实际上有多行的话。

【讨论】:

  • 第一行产生attributeError: 'resultset' object has no attribute split
【解决方案3】:

您是否想要line[127:line.find('\n')],因为您确定它来自127,那么同样您必须确定有一个\n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多