首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Web Scraping - html解析

Python Web Scraping - html解析
EN

Stack Overflow用户
提问于 2019-01-09 00:47:00
回答 2查看 75关注 0票数 1

我正在尝试从纳斯达克网站上提取系统状态信息。以下是页面源代码的一部分:

代码语言:javascript
复制
</script>
<h2>System Status Messages</h2>
<div id='divSSTAT'>
<div class="genTable">
<table style="width: 100%">
<colgroup>
<col class="gtcol1"></col>
<col class="gtcol2"></col>
<col class="gtcol3"></col>
</colgroup>
<tr>
<th class="gtcol1" style="width: 10%">Time</th>
<th class="gtcol2" style="width: 25%">Market</th>
<th class="gtcol3">Status</th>
</tr>
<tr class='sstatNone' ><td class="tddateWidth" style="white-space: nowrap;">11:56:46 ET</td><td class="tdmarketwidth">NASDAQ<br>BX<br>Post - Trade<br>PSX<br>NASDAQ Options<br>BX Options<br>PHLX<br>NASDAQ Futures<br>ISE<br>GEMX<br>MRX</td><td valign="top">Systems are operating normally</td></tr>
</table>
</div>
</div>

想要这样的输出:

代码语言:javascript
复制
System Status Messages
11:56:46 Systems are operating normally

下面是我提取页面内容的方法:

代码语言:javascript
复制
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://www.nasdaqtrader.com/Trader.aspx?id=MarketSystemStatus"
html = urlopen(url)
soup = BeautifulSoup(html, 'lxml')
soup.find_all(["h2","tr"])

这会产生很多不想要的内容。清理它的最好方法是什么,特别是包含实际系统消息的行?现在是这样的..。

代码语言:javascript
复制
<tr class='sstatNone' ><td class="tddateWidth" style="white-space: nowrap;">11:56:46 ET</td><td class="tdmarketwidth">NASDAQ<br>BX<br>Post - Trade<br>PSX<br>NASDAQ Options<br>BX Options<br>PHLX<br>NASDAQ Futures<br>ISE<br>GEMX<br>MRX</td><td valign="top">Systems are operating normally</td></tr>

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-01-09 00:53:21

您可以遍历td标记

代码语言:javascript
复制
from bs4 import BeautifulSoup as soup
s = soup(content, 'html.parser')
_start, *_, _end = [i.text for i in s.find_all('td')]
results = f'{s.h2.text}\n{_start} {_end}'
print(results)

输出:

代码语言:javascript
复制
System Status Messages
11:56:46 ET Systems are operating normally

如果不希望在输出中包含ET,可以使用re.sub

代码语言:javascript
复制
import re
...
results = f'{s.h2.text}\n{re.sub(" [A-Z]+", "", _start)} {_end}'

输出:

代码语言:javascript
复制
System Status Messages
11:56:46 Systems are operating normally
票数 1
EN

Stack Overflow用户

发布于 2019-01-09 03:12:09

在下面的代码中,您可以将3个选择器组合拆分为3个单独的select_one(“此处的独立选择器组合”)选择。只是为了表现自己的兴趣。请注意,在css术语中,较长的选择器和使用量词的选择器的性能稍差一些。

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup as bs
url = 'https://www.nasdaqtrader.com/Trader.aspx?id=MarketSystemStatus'
res = requests.get(url)
soup = bs(res.content,'lxml')
print(' '.join([item.text for item in soup.select('#content h2:nth-of-type(1), #divSSTAT .tddateWidth, #divSSTAT td:nth-of-type(3)')]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54096209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档