使用beauthoulsoup/python解析html页面

2024-06-08 15:42:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在分析一个html页面以提取一些信息:

有时在结束标记后没有文本,例如下面的HTML文档中etos的情况

<span id= "here" style>
  <br>
  <b> Post Primary</b>
  <b>school<b>
  <br>
  <b>Roll number: </b>
  "60000"
  <br>
  <b>Principal</b>
      "Paul Ince"
  <br>
  <b>Enrolment:</b>
  "Boys; 193 Girls: 190   (2012/13)"
  <br>
  <b>Ethos:</b>
  <b>Catchment:</b>
  "North Inner CIty "
  <br>
 <b>Fees:</b>
 " No "
</span>

我想摘录以下信息

入学率=“男孩:193个女孩:190(2012/13)”

Ethos=“”

费用=“否”


Tags: 文档标记文本br信息idherestyle
3条回答

还有一个选择。文档中有html问题,这使我觉得忽略这些问题是合理的,只使用文档的文本(beauthoulsoup也提供了这一点)。您应该确定粗体标记的问题是您的问题还是来自原始来源。在

from bs4 import BeautifulSoup

html = """
<span id= "here" style>
 <br>
  <b> Post Primary</b>
   <b>school<b>
    <br>
     <b>Roll number: </b>b>
    "60000"
<br>
<b>Principal</b>
        "Paul Ince"
        <br>
    <b>Enrolment:</b>
"Boys; 123 Girls: 102   (2012/13)"
<br>
        <b>Ethos:</b>
    "Catholic  &nbsp "
    <b>Catchment:</b>
        "North Inner CIty "
        <br>
        <b>Fees:</b>
            " No "
    </span>
"""

soup = BeautifulSoup(html)
q = soup.text
q = [item for item in q.split('\n') if item!='']
d = {}
for i in range(len(q)):
    if 'Enrolment' in q[i] or 'Ethos' in q[i] or 'Fees' in q[i]:
        d[q[i].strip()] = q[i+1].strip()

print d

修复<b>元素的结束标记,您可以通过注意后面的文本后面有一个粗体标记来解析这样的文档。在

import bs4
soup = bs4.BeautifulSoup(A)
data = {}

for item in soup.findAll("b"):
    next_item = item.nextSibling
    data[item.text.strip()] = next_item.string.strip()

print data

提供一个字典,从中可以提取要查找的元素:

^{pr2}$

这正是你需要的。在

其思想是定义您感兴趣的键/标签列表,找到所有b元素并检查b元素中的文本是否在键/标签列表中。如果是-打印出b元素和下一个同级元素的文本:

from bs4 import BeautifulSoup

data = """<span id= "here" style>
 <br>
 <b> Post Primary</b>
 <b>school<b>
 <br>
 <b>Roll number: </b>b>
 "60000"
 <br>
 <b>Principal</b>
 "Paul Ince"
 <br>
 <b>Enrolment:</b>
 "Boys; 123 Girls: 102   (2012/13)"
 <br>
 <b>Ethos:</b>
 "Catholic  &nbsp "
 <b>Catchment:</b>
 "North Inner CIty "
 <br>
 <b>Fees:</b>
 " No "
</span>"""

soup = BeautifulSoup(data)

keys = ['Enrolment', 'Ethos', 'Fees']

for element in soup('b'):
    if element.text[:-1] in keys:
        print element.text + element.next_sibling.strip()

印刷品:

^{pr2}$

希望有帮助。在

相关问题 更多 >