解析 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,但没有成功。我只编写了打印组标题的程序(在<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))
【问题讨论】:
数据似乎在p
标签内,但您的代码选择了b
标签。我认为你应该选择p
标签。
+1 表示 不使用 regexp! (***.com/questions/1732348/…)
【参考方案1】:
如果不知道实际的源代码格式,我无法对此进行测试,但您似乎想要<p>
标签text
vaue:
for node in soup.findAll('p'):
print(node.text)
# or: keywords = node.text.split(', ')
# print(keywords)
【讨论】:
【参考方案2】:你需要用 /
然后你可以选择你想要的块
例如,如果 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_a
和keyword_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> 标记的内容的主要内容,如果未能解决你的问题,请参考以下文章