BeautifulSoup:解析错误的 Wordpress HTML

BeautifulSoup: Parsing bad Wordpress HTML

所以我需要使用 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;' 等明显的模式可以找到标题,但没有可靠的、可重复使用的方法来抓取 children 并将它们与标题相关联。

正则表达式可能有用,但我觉得随机性会导致抓取模式过于具体而不是 DRY。

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

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

至少,您可以依靠标签名称和文本,水平导航 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"'