Я хотел бы получать ежедневное время восхода / захода солнца с веб-сайта. Можно ли очистить веб-контент с помощью Python? какие модули используются? Есть ли доступный учебник?
Я хотел бы получать ежедневное время восхода / захода солнца с веб-сайта. Можно ли очистить веб-контент с помощью Python? какие модули используются? Есть ли доступный учебник?
Ответы:
Используйте urllib2 в сочетании с блестящей библиотекой BeautifulSoup :
import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())
for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
tds = row('td')
print tds[0].string, tds[1].string
# will print date and sunrise
soup = BeautifulSoup(requests.get('http://example.com').text)
backticks
вокруг кода, и он превратил его в ссылку. Спасибо!
Я бы порекомендовал Scrapy.
Цитата из удаленного ответа:
- Сканирование Scrapy выполняется быстрее, чем механизация, потому что используются асинхронные операции (поверх Twisted).
- Scrapy имеет лучшую и самую быструю поддержку для разбора (x) html поверх libxml2.
- Scrapy - это зрелый фреймворк с полным юникодом, обрабатывает перенаправления, сжатые ответы, нечетные кодировки, встроенный http-кеш и т. Д.
- Как только вы попадаете в Scrapy, вы можете написать паука менее чем за 5 минут, который загружает изображения, создает эскизы и экспортирует извлеченные данные непосредственно в csv или json.
Я собрал воедино скрипты из моей работы по поиску в сети в эту библиотеку .
Пример скрипта для вашего случая:
from webscraping import download, xpath
D = download.Download()
html = D.get('http://example.com')
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'):
cols = xpath.search(row, '/td')
print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2])
Вывод:
Sunrise: 08:39, Sunset: 16:08
Sunrise: 08:39, Sunset: 16:09
Sunrise: 08:39, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:11
Sunrise: 08:40, Sunset: 16:12
Sunrise: 08:40, Sunset: 16:13
Я бы настоятельно рекомендовал проверить Pyquery . Он использует jquery-подобный (он же css-like) синтаксис, который делает вещи действительно простыми для тех, кто приходит из этого фона.
Для вашего случая это будет что-то вроде:
from pyquery import *
html = PyQuery(url='http://www.example.com/')
trs = html('table.spad tbody tr')
for tr in trs:
tds = tr.getchildren()
print tds[1].text, tds[2].text
Вывод:
5:16 AM 9:28 PM
5:15 AM 9:30 PM
5:13 AM 9:31 PM
5:12 AM 9:33 PM
5:11 AM 9:34 PM
5:10 AM 9:35 PM
5:09 AM 9:37 PM
Вы можете использовать urllib2 для выполнения HTTP-запросов, и тогда у вас будет веб-контент.
Вы можете получить это так:
import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()
Beautiful Soup - это анализатор Python HTML, который, как предполагается, хорош для очистки экрана.
В частности, вот их учебник по разбору HTML-документа.
Удачи!
Я использую комбинацию Scrapemark (поиск URL-адресов - py2) и httlib2 (загрузка изображений - py2 + 3). Файл scrapemark.py содержит 500 строк кода, но использует регулярные выражения, поэтому он может быть не таким быстрым, не тестировал.
Пример для очистки вашего сайта:
import sys
from pprint import pprint
from scrapemark import scrape
pprint(scrape("""
<table class="spad">
<tbody>
{*
<tr>
<td>{{[].day}}</td>
<td>{{[].sunrise}}</td>
<td>{{[].sunset}}</td>
{# ... #}
</tr>
*}
</tbody>
</table>
""", url=sys.argv[1] ))
Использование:
python2 sunscraper.py http://www.example.com/
Результат:
[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'},
{'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'},
{'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'},
{'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'},
{'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'},
{'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'},
{'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}]
Сделайте свою жизнь проще, используя CSS Selectors
Я знаю, что опоздал на вечеринку, но у меня есть хорошее предложение для вас.
Использование BeautifulSoup
уже предложено. Я бы предпочел использовать CSS Selectors
для очистки данных внутри HTML
import urllib2
from bs4 import BeautifulSoup
main_url = "http://www.example.com"
main_page_html = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html)
# Scrape all TDs from TRs inside Table
for tr in main_page_soup.select("table.class_of_table"):
for td in tr.select("td#id"):
print(td.text)
# For acnhors inside TD
print(td.select("a")[0].text)
# Value of Href attribute
print(td.select("a")[0]["href"])
# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects)
def tryAgain(passed_url):
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
return page
except Exception:
while 1:
print("Trying again the URL:")
print(passed_url)
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
print("-------------------------------------")
print("---- URL was successfully scraped ---")
print("-------------------------------------")
return page
except Exception:
time.sleep(20)
continue
Если мы думаем о получении имени элементов из какой-либо конкретной категории, мы можем сделать это, указав имя класса этой категории с помощью селектора css:
import requests ; from bs4 import BeautifulSoup
soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml")
for link in soup.select('div._2kSfQ4'):
print(link.text)
Это частичные результаты поиска:
Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers
Philips & moreStarting ₹99LED Bulbs & Emergency Lights
Вот простой веб-сканер, я использовал BeautifulSoup, и мы будем искать все ссылки (якоря) с именем класса _3NFO0d. Я использовал Flipkar.com, это интернет-магазин розничной торговли.
import requests
from bs4 import BeautifulSoup
def crawl_flipkart():
url = 'https://www.flipkart.com/'
source_code = requests.get(url)
plain_text = source_code.text
soup = BeautifulSoup(plain_text, "lxml")
for link in soup.findAll('a', {'class': '_3NFO0d'}):
href = link.get('href')
print(href)
crawl_flipkart()
У Python есть хорошие возможности для очистки сети. Лучший из них - это скрап . Это может быть немного сложно для начинающих, так что здесь немного помочь.
1. Установите Python выше 3,5 (будут работать более низкие до 2.7).
2. Создайте среду в Конде (я сделал это).
3. Установите скрап на месте и бегите оттуда.
4. Scrapy shell
предоставит вам интерактивный интерфейс для проверки вашего кода.
5. Scrapy startproject projectname
создаст рамки.
6. Scrapy genspider spidername
создаст паука. Вы можете создать столько пауков, сколько захотите. При этом убедитесь, что вы находитесь в каталоге проекта.
Легче использовать запросы и красивый суп . Прежде чем начать, дайте один час времени на изучение документации, это решит большинство ваших сомнений. BS4 предлагает широкий выбор парсеров, которые вы можете выбрать. Используйте user-agent
и sleep
сделать очистку легче. BS4 возвращает bs.tag, так что используйте variable[0]
. Если работает js, вы не сможете очистить, используя запросы и bs4 напрямую. Вы можете получить ссылку API, а затем проанализировать JSON, чтобы получить необходимую информацию или попробовать selenium
.