【问题标题】:Using BeautifulSoup4 to get string with/without <p> tag inside <div> section [duplicate]使用 BeautifulSoup4 在 <div> 部分中获取带有/不带有 <p> 标签的字符串 [重复]
【发布时间】:2016-07-04 21:31:47
【问题描述】:

我有一个要使用 BS4 废弃的旧网页。其中一个部分是一篇很长的文章,我需要删掉。那篇文章的格式很奇怪:

<div id='essay'>
  this is paragraph1
  <p>this is paragraph2</p>
  this is paragraph3
  <p>this is paragraph4</p>
</div>

使用 bs4,我尝试了以下操作: 使用

soup.find('div', id='essay').text

我可以提取

'this is paragraph1' and 'this is paragraph3'

ps = soup.find('div', id='essay').find_all('p')
for p in ps:
    print p.text

我可以提取

'this is paragraph2' and 'this is paragraph4'

如果我同时使用,我会得到第 1、3、2、4 段,这是乱序的。我需要确保段落顺序也是正确的。我该怎么做才能做到这一点?

编辑:问题中的问题只是一个例子,它不能保证在偶数和奇数段落之间交错......让我澄清一下我的问题:我想有一种方法来提取段落 IN SEQUENCE 不管有没有

【问题讨论】:

  • soup.find('div', id="essay").text 得到你想要的,所以你的实际 html 必须有更多。那或者你正在使用一些旧的错误版本的 bs4

标签: python web-scraping beautifulsoup


【解决方案1】:

BeautfulSoup4 还有递归模式,默认开启。

from bs4 import BeautifulSoup
html = """
<div id='essay'>
  this is paragraph1
  <p>this is paragraph2</p>
  this is paragraph3
  <p>this is paragraph4</p>
</div>
"""

soup = BeautifulSoup(html, "html.parser")
r = soup.find('div', id="essay", recursive=True).text
print (r)

非常适合我。 尝试使用 pip 更新 BeautifulSoup4。

【讨论】:

  • 默认是recursive=True
  • @PadraicCunningham 谢谢,我已经编辑过了。
  • 我的意思是 soup.find('div', id="essay").text 有效并且与 soup.find('div', id="essay", recursive=True).text 相同,但 OP 已经声明它不适合他们
  • OP 应该发布他的完整 HTML,并使用 pip 更新 bs4...
【解决方案2】:

如果列表的长度相同,则将它们交错可能会更容易,而不是编写代码来绕过 Beautiful Soup 的原始格式

from itertools import chain

list_a = ['this is paragraph1', 'this is paragraph3']
list_b = ['this is paragraph2', 'this is paragraph4']

print(list(chain.from_iterable(zip(list_a, list_b))))


# ['this is paragraph1', 'this is paragraph2', 'this is paragraph3', 'this is paragraph4']

更多信息在这里:Interleaving Lists in Python

【讨论】:

  • 感谢您的深入回答,请查看我的编辑,我在问题中添加了一些更新的信息。很抱歉造成混乱。
  • 我完全错过了这个问题!非常感谢!
【解决方案3】:

以下似乎有效

import bs4

soup = bs4.BeautifulSoup("""
<div id='essay'>
this is paragraph1
<p>this is paragraph2</p>
this is paragraph3
<p>this is paragraph4</p>
</div>
""", "lxml")

main = soup.find('div', id='essay')
for child in main.children:
    print(child.string)

【讨论】:

  • 你必须在BeautifulSoup函数中指定你的解析器。否则,您可能会在其他系统中遇到不希望的行为,并发出大警告。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 2022-11-22
  • 1970-01-01
  • 2018-07-11
  • 2015-05-02
  • 1970-01-01
  • 2012-05-26
  • 2016-01-09
相关资源
最近更新 更多