【问题标题】:Beautiful Soup parsing multiple <div> and successive <p> tags into dictionaryBeautiful Soup 将多个 <div> 和连续的 <p> 标签解析为字典
【发布时间】:2017-03-10 21:57:44
【问题描述】:

我有多个内联 div(它们是“标题”)和下面的段落标签(不是在 div 中),理论上是“孩子”...我想将其转换为字典。我无法完全弄清楚最好的方法。网站大致如下:

<div><span>This should be dict key1</span></div>
<p>This should be the value of key1</p>
<p>This should be the value of key1</p>
<div><span>This should be dict key2</span></div>
<p>This should be the value of key2</p>

我使用的 Python 代码如下所示:

soup = bs.BeautifulSoup(source,'lxml')

full_discussion = soup.find(attrs={'class' : 'field field-type-text field-field-discussion'})

ava_discussion = full_discussion.find(attrs = {'class': 'field-item odd'})

for div in ava_discussion.find_all("div"):
    discussion = []

    if div.findNextSibling('p'):
        discussion.append(div.findNextSibling('p').get_text())

    location = div.get_text()

    ava_dict.update({location: {"discussion": discussion}}

但是,问题是这段代码只添加了 FIRST &lt;p&gt; 标记,然后移动到下一个 div。最终,我想我想将每个&lt;p&gt; 添加到discussion 的列表中。救命!

更新:

添加while 循环会产生第一个循环的副本

标签表示存在的数量。代码如下:

for div in ava_discussion.find_all("div"):
    ns = div.nextSibling

    discussion = []

    while ns is not None and ns.name != "div":
        if ns.name == "p":
            discussion.append(div.findNextSibling('p').get_text())
        ns = ns.nextSibling

    location = div.get_text()

    ava_dict.update({location : {"discussion": discussion}})

print(json.dumps(ava_dict, indent=2))

【问题讨论】:

  • 那么我建议herewhile 循环有什么问题?似乎对我有用。
  • @Psidom 见上文。
  • 啊。问题解决了。
  • discussion.append(div.findNextSibling('p').get_text()) 更改为discussion.append(ns.text),因为您已经在循环ns = ns.nextSibling 行中的节点。

标签: python beautifulsoup


【解决方案1】:

我没有添加正确的文本。此代码有效:

for div in ava_discussion.find_all("div"):
    ns = div.nextSibling

    discussion = []

    while ns is not None and ns.name != "div":
        if ns.name == "p":
            discussion.append(ns.get_text())
        ns = ns.nextSibling

    location = div.get_text()

    ava_dict.update({location : {"discussion": discussion}})

print(json.dumps(ava_dict, indent=2))

【讨论】:

    【解决方案2】:

    这个怎么样?

        paragraphs = div.findNextSiblings('p') 
        for sibling in div.findNextSiblings():
            if sibling in paragraphs:
                discussion.append(sibling.get_text())
            else:
                break
    

    现在,谁能告诉我如何让它更优雅:)

    【讨论】:

    • 哦,我明白你的意思了。我已经修改了答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2016-05-10
    • 2016-12-26
    • 2011-01-18
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多