python - 如何提取两个角色之间的兴趣值?
问题描述
我正在使用以下 HTML 代码进行网页抓取:
Predecessors · <i class="fa fa-sign-in"></i> / Successors · <i class="fa fa-sign-out"></i>
</dt>
<dd>
1931 ·
<a class="active" href="../../../aus/party/1253">
ALP </a> ·
<i class="fa fa-sign-in"> </i> splinter
</dd>
<dd>
1931 ·
<a class="active" href="../../../aus/party/1905">
NAT </a> ·
<i class="fa fa-sign-in"> </i> successor
</dd>
我用来获取上述输出的代码如下:
import urllib.request
url_pc = str('http://www.parlgov.org/explore/aus/party/1912/")
fp = urllib.request.urlopen(url_pc)
mybytes = fp.read()
mystr = mybytes.decode("utf8")
fp.close()
#print(mystr)
str1 = mystr[mystr.find('Predecessors'):]
str2 = str1.split("</div>", 1)[0]
str3 = str2.split("<dt> Party (name) changes</dt>", 1)[0]
print(str3)
我想提取每个组之间<dd>
和</dd>
每个组中的所有内容,使其成为一个字符串,然后将其添加到一行数据中。是否有一个我可以运行的循环或我可以使用的代码来提取两组之间<dd>
的所有字符串?</dd>
解决方案
您可以使用BeautifuSoup
查找所有<dd>
内容,然后获取每个<dd>
列表的内容。然后您可以将列表的元素连接到一个字符串。一些元素可以是需要转换为字符串的对象。您也可以使用strip()
删除一些空间,但它可能仍需要如此清洁。
text = '''Predecessors · <i class="fa fa-sign-in"></i>
/ Successors · <i class="fa fa-sign-out"></i>
</dt>
<dd>
1931 ·
<a class="active"
href="../../../aus/party/1253">
ALP </a>
·
<i class="fa fa-sign-in"> </i>
splinter
</dd>
<dd>
1931 ·
<a class="active"
href="../../../aus/party/1905">
NAT </a>
·
<i class="fa fa-sign-in"> </i>
successor
</dd>'''
from bs4 import BeautifulSoup as BS
soup = BS(text, 'html.parser')
for item in soup.find_all('dd'):
print(''.join(str(x).strip() for x in item.contents))
结果
1931 ·<a class="active" href="../../../aus/party/1253">
ALP </a>·<i class="fa fa-sign-in"> </i>splinter
1931 ·<a class="active" href="../../../aus/party/1905">
NAT </a>·<i class="fa fa-sign-in"> </i>successor
编辑:
from bs4 import BeautifulSoup as BS
soup = BS(text, 'html.parser')
all_rows = []
for item in soup.find_all('dd'):
#print(''.join(str(x).strip() for x in item.contents))
row = (item.contents[0].strip()[:-2], item.find('a').get_text().strip(), item.contents[4].strip(), item.find('a').get('href')[-4:])
row = ', '.join(row)
print(row)
all_rows.append(row)
text = ' | '.join(all_rows)
print(text)
结果:
1931, ALP, splinter, 1253
1931, NAT, successor, 1905
1931, ALP, splinter, 1253 | 1931, NAT, successor, 1905
推荐阅读
- r - 将字符串格式化为可用的数据框
- swift - 为什么面试官对我在 Swift 4 中的 QuickSort 实现不满意?
- java - 如何同时将控制台输出写入文件和控制台
- jquery - JQuery 同位素 - 组合过滤器
- c# - Global.asax.cs 中的编译错误
- haskell - Haskell List Comprehension order elements/tuples
- raspberry-pi - 树莓派 3b 上的电子黑屏
- azure - azure scaleset VM 中的磁盘附件问题
- asp.net-mvc - SignalR 对于异步任务的简单通知是否过度杀伤?
- javascript - 在反应项目中需要各种模块的问题