Как использовать BeautifulSoup для извлечения из абзаца HTML? - PullRequest
1 голос
/ 03 июля 2010

Я использую BeautifulSoup, чтобы сделать некоторую очистку экрана.Моя проблема заключается в следующем: мне нужно извлечь конкретные вещи из абзаца.Пример:

<p><b><a href="/name/abe">ABE</a></b> &nbsp; <font class="masc">m</font> &nbsp; <font class="info"><a href="/nmc/eng.php" class="usg">English</a>, <a href="/nmc/jew.php" class="usg">Hebrew</a></font><br />Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>

Из этого абзаца я могу извлечь имя ABE следующим образом:

for pFound in soup.findAll('p'):

    print pFound


#will get the names
    x = pFound.find('a').renderContents()
    print x

Теперь моя проблема состоит в том, чтобы извлечь другое имя,в том же абзаце.

Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>

Мне нужно извлечь это, только если тегу a предшествует текст «Краткая форма»

Есть идеи, как это сделать?На странице HTML есть много таких абзацев, и не все из них имеют текст «Краткая форма». Они могут содержать какой-то другой текст в этом месте.может быть полезно, но я не знаком с BeautifulSoup.Закончилось тратить довольно много времени.

Любая помощь будет оценена.Спасибо.

Ответы [ 2 ]

1 голос
/ 03 июля 2010

Следующее должно работать ...:

htm = '''<p><b><a href="/name/abe">ABE</a></b> &nbsp; <font class="masc">m
</font>&nbsp; <font class="info"><a href="/nmc/eng.php" class="usg">English
</a>, <a href="/nmc/jew.php" class="usg">Hebrew</a></font><br />
Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>'''

import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(htm)

for p in soup.findAll('p'):
  firsta = True
  shortf = False
  for c in p.recursiveChildGenerator():
    if isinstance(c, BeautifulSoup.NavigableString):
      if 'Short form of' in str(c):
        shortf = True
    elif c.name == 'a':
      if firsta or shortf:
        print c.renderContents()
        firsta = shortf = False
0 голосов
/ 03 июля 2010

Вы можете использовать pyparsing как своего рода «супер-регулярное выражение» для анализа HTML.Вы можете составить простой шаблон сопоставления, собрав различные начальные и конечные теги, не отключая типичные ошибки регулярного выражения в HTML (непредсказуемый регистр тега / атрибута, непредсказуемые атрибуты, атрибуты не в порядке, непредсказуемые пробелы).Затем pattern.scanString вернет генератор, который просканирует исходный код HTML и вернет кортежи совпадающих токенов, начальное и конечное местоположения.Добавьте присвоение имен результатов (аналогично именованным полям в регулярном выражении) и получите доступ к отдельным интересующим полям просто.

html = """<some leading html>
<p><b><a href="/name/abe">ABE</a></b> &nbsp; <font class="masc">m</font> &nbsp; 
<font class="info"><a href="/nmc/eng.php" class="usg">English</a>, <a href="/nmc/jew.php" class="usg">
Hebrew</a></font><br />Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>
<some trailing html>"""

from pyparsing import makeHTMLTags, SkipTo, Optional

pTag,pEnd = makeHTMLTags("P")
bTag,bEnd = makeHTMLTags("B")
aTag,aEnd = makeHTMLTags("A")
fontTag,fontEnd = makeHTMLTags("FONT")
brTag = makeHTMLTags("BR")[0]
nbsp = "&nbsp;"

nickEntry = (pTag + bTag + aTag + SkipTo(aEnd)("nickname") + aEnd + bEnd + Optional(nbsp) + 
            fontTag + SkipTo(fontEnd) + fontEnd + Optional(nbsp) +
            fontTag + aTag + SkipTo(aEnd) + aEnd + "," +
            aTag + SkipTo(aEnd) + aEnd + fontEnd + 
            brTag + "Short form of" +
            aTag + SkipTo(aEnd)("fullname") + aEnd)

for match,_,_ in nickEntry.scanString(html):
    print match.nickname, "->", match.fullname

печать:

ABE -> ABRAHAM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...