Разобрать HTML-страницу, чтобы получить содержимое тегов <p>и <b> - PullRequest
0 голосов
/ 31 декабря 2018

Существует множество HTML-страниц, которые структурированы в виде последовательности таких групп:

<p>
   <b> Keywords/Category:</b>
   "keyword_a, keyword_b"
</p>

Адреса этих страниц похожи на https://some.page.org/year/0001, https://some.page.org/year/0002, и т. Д.

Как я могу извлечь ключевые слова отдельно от каждой из таких страниц?Я пытался использовать BeautifulSoup, но безуспешно.Я только написал программу, которая печатает названия групп (от <b> до </b>).

from bs4 import BeautifulSoup
from urllib2 import urlopen
import re
html_doc = urlopen('https://some.page.org/2018/1234').read()
soup = BeautifulSoup(html_doc)
for link in soup.find_all('a'):
    print 'https://some.page.org'+link.get('href')
for node in soup.findAll('b'):
    print ''.join(node.findAll(text=True))

Ответы [ 4 ]

0 голосов
/ 01 января 2019

Существуют различные способы синтаксического анализа HTML нужных категорий и ключевых слов из такой структуры HTML, но вот один из способов «BeautifulSoup» сделать это:

  • найти b элементовс текстом, который заканчивается на :
  • , используйте .next_sibling, чтобы перейти к следующему текстовому узлу, который содержит ключевые слова

Рабочий пример:

from bs4 import BeautifulSoup


data = """
<div>
    <p>
       <b> Category 1:</b>
       "keyword_a, keyword_b"
    </p>
    <p>
       <b> Category 2:</b>
       "keyword_c, keyword_d"
    </p>
</div>
"""

soup = BeautifulSoup(data, "html.parser")

for category in soup('b', text=lambda text: text and text.endswith(":")):
    keywords = category.next_sibling.strip('" \n').split(", ")

    print(category.get_text(strip=True), keywords)

Печать:

Category 1: ['keyword_a', 'keyword_b']
Category 2: ['keyword_c', 'keyword_d']
0 голосов
/ 31 декабря 2018

Предполагая, что для каждого блока

<p>
   <b> Keywords/Category:</b>
   "keyword_a, keyword_b"
</p>

вы хотите извлечь keyword_a и keyword_b для каждого Keywords/Category.Примером может быть:

 <p>
    <b>Mammals</b>
    "elephant, rhino"
 </p>
 <p>
    <b>Birds</b>
    "hummingbird, ostrich"
 </p>

Как только у вас есть HTML-код, вы можете сделать:

from bs4 import BeautifulSoup

html = '''<p>
    <b>Mammals</b>
    "elephant, rhino"
    </p>
    <p>
    <b>Birds</b>
    "hummingbird, ostrich"
    </p>'''

soup = BeautifulSoup(html, 'html.parser')

p_elements = soup.find_all('p')
for p_element in p_elements:
    b_element = soup.find_all('b')[0]
    b_element.extract()
    category = b_element.text.strip()
    keywords = p_element.text.strip()
    keyword_a, keyword_b = keywords[1:-1].split(', ')
    print('Category:', category)
    print('Keyword A:', keyword_a)
    print('Keyword B:', keyword_b)

Что печатает:

Category: Mammals
Keyword A: elephant
Keyword B: rhino
Category: Birds
Keyword A: hummingbird
Keyword B: ostrich
0 голосов
/ 31 декабря 2018

Я не могу проверить это, не зная фактического формата исходного кода, но, похоже, вам нужны теги <p> text vaue:

for node in soup.findAll('p'):
    print(node.text)
    # or: keywords = node.text.split(', ')
    # print(keywords)
0 голосов
/ 31 декабря 2018

Вам нужно разделить строку, которая в данном случае является URL-адресом, с /

И затем вы можете выбрать нужные куски

Например, если URL-адресhttps://some.page.org/year/0001 я использую функцию split, чтобы разделить URL с помощью / sign

, он преобразует его в массив, а затем я выбираю то, что мне нужно, и снова преобразую его в строкус методом ''.join() вы можете прочитать о методе разделения в этой ссылке

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