解析HTML页面以获取<p>和<b>标记的内容

时间:2018-12-31 20:31:10

标签: python html beautifulsoup web-crawler

有许多HTML页面按这样的组顺序构成:

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

这些页面的地址类似https://some.page.org/year/0001https://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 :(得分:2)

我无法在不知道实际源代码格式的情况下对此进行测试,但是看来您想要<p>标签text有价值:

for node in soup.findAll('p'):
    print(node.text)
    # or: keywords = node.text.split(', ')
    # print(keywords)

答案 1 :(得分:1)

您需要使用 /

分割字符串(在这种情况下为url)

然后您可以选择所需的块

例如,如果网址是 https://some.page.org/year/0001 ,则我使用分割功能以 / 符号

分割网址

它将转换为数组,然后选择所需的内容,然后再次使用''.join()方法将其转换为字符串,您可以在此link中了解split方法

答案 2 :(得分:1)

有多种方法可以从此类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']

答案 3 :(得分:0)

假设每个块

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

您要为每个keyword_a提取keyword_bKeywords/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