使用BS4,Python和Selenium后解析文本

时间:2014-10-21 10:53:48

标签: python regex selenium web-scraping beautifulsoup

使用我的刮擦脚本后:

from selenium import webdriver
from bs4 import BeautifulSoup
import csv

browser = webdriver.Firefox()
browser.get('http://dyn.com/about/events/')
html = browser.page_source
soup = BeautifulSoup(html)
titles = [tag.text for tag in soup.find_all('p','pubdate')]

我得到的结果如下:

  

[u'\ n \ n \ t \ t \ tWEBINAR:如何扩大您的全球影响力到中国\ xa0 \ n \ t \ t \ t \ n \ t \ t \ t \ t \ 2014年12月\ t \ t \ t \ n \ n \ n',\ n \ n \ n \ n \ t \ t \ t \ t \ t \ tt \ nattend \ n',u'\ n \ n \ t \ t \ tAcquia参与用户大会\ u2013波士顿,马萨诸塞州\ n \ t \ t \ t \ n \ t \ t \ t \ tNov 2014年3月5日\ t \ t \ t \ nexhibitattend \ n',u'\ n \ n \ t \ t \ t \ tCloud Expo \ u2013圣克拉拉,加利福尼亚\ xa0 \ n \ t \ t \ t \ n \ t \ t \ t \ t 2014年4月6日\ t \ t \ t \ nexhibit \ n',u'\ n \ n \ t \ t \ t \ 2014年全球运营商奖\阿姆斯特丹\ xa0 \ n \ t \ t \ t \ t \ n \ t \ t \ t 2014年4月4日\ t \ t \ t \ n \ n',u'\ n \ n \ t \ t \ t \ ttw \ tw \ Summit \ u2013都柏林,爱尔兰\ xa0 \ n \ t \ t \ \ t \ n \ t \ t \ tNov 4 - 6,2014 \ t \ t \ t \ n \ t \ n \ n \ n',u'\ n \ n \ t \ t \ t \ t \ tVelocity Europe \ u2013巴塞罗那,西班牙\ xa0 \ n \ t \ t \ t \ n \ t \ t \ tNov 17 - 19,2014 \ t \ t \ t \ nexhibit \ n',u'\ n \ n \ t \ t \ tNH / VT FIRST LEGO League Championship Event \ xa0 \ n \ t \ t \ t \ n \ t \ t \ t \ tDec 6,2014 \ t \ t \ t \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n> \ n \ n“

我是python的新手,所以你能建议我如何从这个结果中获取事件名称,日期,事件类型?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以替换输出中的\n\t

例如,您可以使用re.sub函数替换。

import re

for val in titles:
     print re.sub("[\n\t]", "", val)

将产生输出

    WEBINAR: How To Expand Your Global Reach To China Oct 22, 2014speak
    LAUNCH Scale – San Francisco, CA Oct 23 - 24, 2014attend
    Acquia Engage User Conference – Boston, MA Nov 3 - 5, 2014exhibitattend
    Cloud Expo – Santa Clara, CA Nov 4 - 6, 2014exhibit
    The Global Carrier Awards 2014 – Amsterdam Nov 4, 2014
    Web Summit – Dublin, Ireland Nov 4 - 6, 2014speak
    Velocity Europe – Barcelona, Spain Nov 17 - 19, 2014exhibit
    NH/VT FIRST LEGO League Championship Event Dec 6, 2014speak

功能

re.sub("[\n\t]", "", val)

用空字符串替换\n\t

答案 1 :(得分:0)

您可以使用stripped_strings属性来拔出每个组件并构建一个字典列表,如下所示:

from selenium import webdriver
from bs4 import BeautifulSoup
import csv

browser = webdriver.Firefox()
browser.get('http://dyn.com/about/events/')
html = browser.page_source
soup = BeautifulSoup(html)

events = []
titles = soup.find_all('p','pubdate')
for title in titles:
    event = list(title.stripped_strings)
    events.append({
        'event_name': event[0],
        'event_date': event[1],
        'event_type': event[2:]    # there can be multiple event types so use a list
    })

>>> from pprint import pprint
>>> for event in events:
...     pprint(event)
{'event_date': u'Oct 22, 2014',
 'event_name': u'WEBINAR: How To Expand Your Global Reach To China',
 'event_type': [u'speak']}
{'event_date': u'Oct 23 - 24, 2014',
 'event_name': u'LAUNCH Scale \u2013 San Francisco, CA',
 'event_type': [u'attend']}
{'event_date': u'Nov 3 - 5, 2014',
 'event_name': u'Acquia Engage User Conference \u2013 Boston, MA',
 'event_type': [u'exhibit', u'attend']}
{'event_date': u'Nov 4 - 6, 2014',
 'event_name': u'Cloud Expo \u2013 Santa Clara, CA',
 'event_type': [u'exhibit']}
{'event_date': u'Nov 4, 2014',
 'event_name': u'The Global Carrier Awards 2014 \u2013 Amsterdam',
 'event_type': []}
{'event_date': u'Nov 4 - 6, 2014',
 'event_name': u'Web Summit \u2013 Dublin, Ireland',
 'event_type': [u'speak']}
{'event_date': u'Nov 17 - 19, 2014',
 'event_name': u'Velocity Europe \u2013 Barcelona, Spain',
 'event_type': [u'exhibit']}
{'event_date': u'Dec 6, 2014',
 'event_name': u'NH/VT FIRST LEGO League Championship Event',
 'event_type': [u'speak']}

您可能还想在字符串event[0]

上拆分事件名称和事件位置拆分u' \u2013 '