Python Web Scraping - html-разбор - PullRequest
       7

Python Web Scraping - html-разбор

0 голосов
/ 08 января 2019

Я пытаюсь извлечь сообщения о состоянии системы с сайта nasdaq. Вот часть страницы источника:

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

Хотите вывод, как это:

System Status Messages
11:56:46 Systems are operating normally

Вот что я делаю, чтобы извлечь содержимое страницы:

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

Это дает много нежелательного контента. Как лучше всего очистить его, особенно строки, содержащие фактическое системное сообщение? сейчас это так ...

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В дальнейшем вы можете разделить 3 комбинации селекторов на 3 отдельных выбора select_one («комбинация отдельных селекторов здесь»). Просто показывать ради интереса вместе взятых. Обратите внимание, что более длинные селекторы и те, которые используют квантификаторы, немного менее производительны в терминах CSS.

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)')]))
0 голосов
/ 08 января 2019

Вы можете перебирать теги td

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)

Выход:

System Status Messages
11:56:46 ET Systems are operating normally

Если вы не хотите, чтобы ET был включен в вывод, вы можете использовать re.sub:

import re
...
results = f'{s.h2.text}\n{re.sub(" [A-Z]+", "", _start)} {_end}'

Выход:

System Status Messages
11:56:46 Systems are operating normally
...