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

Posted

技术标签:

【中文标题】解析 HTML 页面以获取 <p> 和 <b> 标记的内容【英文标题】:Parse HTML page to get contents of <p> and <b> tags 【发布时间】:2019-05-28 04:59:08 【问题描述】:

有很多 html 页面是由一系列这样的组构成的:

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

这些页面的地址如https://some.page.org/year/0001、https://some.page.org/year/0002等

如何从每个此类页面中分别提取关键字?我尝试过使用 BeautifulSoup,但没有成功。我只编写了打印组标题的程序(在&lt;b&gt;&lt;/b&gt; 之间)。

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))

【问题讨论】:

数据似乎在p 标签内,但您的代码选择了b 标签。我认为你应该选择p 标签。 +1 表示 不使用 regexp (***.com/questions/1732348/…) 【参考方案1】:

如果不知道实际的源代码格式,我无法对此进行测试,但您似乎想要&lt;p&gt; 标签text vaue:

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

【讨论】:

【参考方案2】:

你需要用 /

分割你的字符串,在这种情况下是 url

然后你可以选择你想要的块

例如,如果 url 是 https://some.page.org/year/0001 我使用 split 函数来分割带有 / 符号的 url

它会将其转换为数组,然后我选择我需要的内容并再次使用''.join() 方法将其转换为字符串,您可以在此link 中阅读有关拆分方法的信息

【讨论】:

【参考方案3】:

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']

【讨论】:

【参考方案4】:

假设每个块

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

您想为每个Keywords/Category 提取keyword_akeyword_b。所以一个例子是:

 <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

【讨论】:

以上是关于解析 HTML 页面以获取 <p> 和 <b> 标记的内容的主要内容,如果未能解决你的问题,请参考以下文章

Python - Django - 命名 URL 和反向解析 URL

在wordpress中获取<p>标签内的内容

解析xml以获取两个节点之间的所有节点

django URL反向解析和命名空间

使用 HtmlAgilityPack 解析 HTML 页面

页面加载时获取位置