【问题标题】:BeautifulSoup: Parsing bad Wordpress HTMLBeautifulSoup:解析错误的 Wordpress HTML
【发布时间】:2015-09-08 11:46:00
【问题描述】:

所以我需要使用 Python 抓取一些网站,但问题是标记是随机的、非结构化的,并且很难使用。

例如

<p style='font-size: 24px;'>
    <strong>Title A</strong>
</p>
<p>
    <strong> First Subtitle of Title A </strong>
    "Text for first subtitle"
</p>

然后会切换到

<p>
    <strong style='font-size: 24px;'> Second Subtitle for Title B </strong>
</p>

然后有时新的字幕会添加到前一个字幕文本的末尾

<p>
    ...title E's content finishes 
    <strong>
        <span id="inserted31" style="font-size: 24px;"> Title F </span>
    </strong>
</p>
<p>
    <strong> First Subtitle for Title F </strong> 
</p>

足够混乱,这只是糟糕的标记。明显的模式,例如 'font-size:24px;'可以找到标题,但没有可靠的、可重复使用的方法来抓取孩子并将它们与标题相关联。

正则表达式可能有效,但我觉得随机性会导致抓取模式过于具体且不干燥。

我可以提议重写 html 并修复层次结构,但是,这是一个 wordpress 网站,我担心内容可能会在 wordpress 界面中与管理员不兼容。

任何关于更好的抓取方法或使用 wordpress 的方法的建议将不胜感激。我想尽可能避免复制/粘贴。

【问题讨论】:

  • 到目前为止你尝试过什么代码?
  • 你到底想什么?
  • @mescalinum 我试过按 font-size 属性排序,但我需要能够抓取不那么嵌套的关联内容(查找标题、获取字幕和字幕的内容),sln .问题是,所有内容都是

    ,而不是嵌套的、有组织的方式,可以轻松使用兄弟姐妹。

标签: python html regex wordpress beautifulsoup


【解决方案1】:

至少,您可以依靠标签名称和文本水平导航 DOM 树 - going sideways。这些都是您显示的strongpspan(带有id 属性集)标签。

例如,您可以获取strong 文本并获取以下兄弟:

>>> from bs4 import BeautifulSoup
>>> data = """
... <p style='font-size: 24px;'>
...     <strong>Title A</strong>
... </p>
... <p>
...     <strong> First Subtitle of Title A </strong>
...     "Text for first subtitle"
... </p>
... """
>>> soup = BeautifulSoup(data)
>>> titles = soup.find_all('strong')
>>> titles[0].text
u'Title A'
>>> titles[1].get_text(strip=True)
u'First Subtitle of Title A'
>>> titles[1].next_sibling.strip()
u'"Text for first subtitle"'

【讨论】:

  • 这有帮助!谢谢。这会找到所有的标题和副标题,所以当它找到第一个副标题时我可能可以对它们进行排序(所有标题都以副标题“intro”开头)。唯一的问题是某些文本与其各自的副标题共享一个

    标签,所以我必须使用 title[1].parent 或其他东西。再次感谢!

猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多