2016-05-15 2 views
0

В настоящее время я следую курсу в области больших данных, но не понимаю его. Для задания я хотел бы узнать, какие темы обсуждаются на форуме TripAdvisor об Амстердаме. Я хочу создать CSV-файл, включая тему, автора и количество ответов в теме. Некоторые вопросы:Петля на разных веб-страницах с использованием Python

  1. Как составить список всех тем? Я проверил сайт-источник для всех страниц, и тема всегда указана за 'onclick="setPID(34603)' и заканчивается </a>. Я пробовал '(re.findall(r'onclick="setPID(34603)">(.*?)</a>', пост), но он не работает.
  2. Ответы не приведены в комментариях, но в отдельной строке на странице. Как я могу создать цикл и добавить все ответы в новую переменную?
  3. Как мне перебирать первые 20 страниц? URL-адрес моего кода включает только 1-ю страницу, дающую 20 тем.
  4. Создавать ли файл CSV до или после цикла?

Вот мой код:

from urllib import request 
import re 
import csv 

topiclist=[] 
metalist=[] 

req = request.Request('https://www.tripadvisor.com/ShowForum-g188590-i60- 
Amsterdam_North_Holland_Province.html', headers={'User-Agent' : 
"Mozilla/5.0"}) 

tekst=request.urlopen(req).read() 
tekst=tekst.decode(encoding="utf-8",errors="ignore").replace("\n"," ") 
.replace("\t"," ") 


topicsection=re.findall(r'<b><a(.*?)</div>',tekst) 

topic=[] 
for post in topicsection: 
    topic.append(re.findall(r'onclick="setPID(34603)">(.*?)</a>', post) 


author=[] 
for post in topicsection: 
    author.append(re.findall(r'<a href="/members-forums/.*?">(.*?)</a>', 
    post)) 

replies=re.findall(r'<td class="reply rowentry.*?">(.*?)</td>',tekst) 
+0

Столько, сколько я ненавижу говорить, если вы выскабливание веб-страницы, вы, вероятно, будет иметь удачи, используя 'xml.dom' –

ответ

3

Don't use regular expressions to parse HTML. Используйте HTML-парсер, такие как BeautifulSoup.

например -

from bs4 import BeautifulSoup 
import requests 

r = requests.get("https://www.tripadvisor.com/ShowForum-g188590-i60-Amsterdam_North_Holland_Province.html") 
soup = BeautifulSoup(r.content, "html.parser") #or another parser such as lxml 
topics = soup.find_all("a", {'onclick': 'setPID(34603)'}) 
#do stuff 
+1

См [этот ответ] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) и [этот] (http://stackoverflow.com/a/ 1758162/2791611) по причинам, почему – amiller27

+0

Спасибо за добавление ссылок! Сначала я искал первую. Это жемчужина ответа. – Pythonista

+0

Большое спасибо! Я действительно попробовал BeautifulSoup, но с другим кодом. Когда я печатаю темы, я действительно вижу их, но все равно получаю URL-адрес в теме на выходе. Например: Taste of Amsterdam festival Возможно ли ТОЛЬКО распечатать «Вкус фестиваля в Амстердаме»? – Tessa

Смежные вопросы