<ENGLISH>
Hello - I hope you have a good day. Happy weekend should be happy cording day :smile:
Ok, today I will not proceed the scripting and I'd like to modify previous script. The script is below from #2:
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
Yes, it works, but want to use (1) BeautifulSoup instead of regular expression and (2)Hash list instead of counting inside for.
(1) BeautifulSoup
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
Regular Expression is strong tool, but I have to learn BeautifulSoup more. Beautiful Soup is using unique type for it's string, and we can check how to use it in user's guide. I modified it as below.
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
soup2 = BeautifulSoup(tag.encode('utf8'), "lxml")
print "".join([string.encode('utf8') for string in soup2.strings])
Looks smarter? :satisfied: you got another soup for getting strings. Which do you like?
(2) Hash List for splitting. Watch out!
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
To get splitter strings for each web site, used c as count up integer. That's not cool. So I modified as below.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
numHash = {}
for i in range(len(scraper)):
numHash[scraper[i][0]] = i
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
c = numHash[domain[0]]
break
yes, it becomes longer, but I think it's much better than previous, isn't it?
Great, next I hope I can proceed to next step... It will be getting elements for learning.
Oui, domo. C'est un week-end. Allons coder pour passer un bon week-end. Aujourd'hui, j'aimerais modifier le script que j'ai fait dans # 2 avant de continuer. Ça y est.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
Cela fonctionne toujours, mais les changements sont (1) utiliser BeautifulSoup au lieu de l'expression régulière pour la suppression des balises, et (2) utiliser la liste de hachage au lieu du décompte pour la sélection du délimiteur. Je vais.
(1) Utilisez une belle soupe
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
text = ""
for con in tag.contents:
p = re.compile(r'<.*?>')
text += p.sub('', con.encode('utf8'))
Les expressions régulières sont très pratiques, mais je me demandais si je pourrais rendre Beautiful Soup plus efficace. Dans BS, des outils pour extraire la chaîne de caractères à l'intérieur sont disponibles, mais c'était difficile au début en raison du format de chaîne de caractères unique. Cependant, il est bien documenté, donc je n'ai pas d'autre choix que de m'y habituer.
Et c'est après le changement!
soup = BeautifulSoup( html, "lxml" )
soup.originalEnoding
tag = soup.find( scraper[c][1], {scraper[c][2] : scraper[c][3]})
soup2 = BeautifulSoup(tag.encode('utf8'), "lxml")
print "".join([string.encode('utf8') for string in soup2.strings])
N'est-ce pas cool? J'ai changé la soupe pour retirer la chaîne de caractères de l'étiquette en la remplaçant à nouveau.
(2) Utilisez une liste de hachage comme délimiteur À propos d'ici.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
c = 0
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
break
c += 1
C'est comme compter les variables C et ajuster le nombre de délimiteurs. Hmmm, ça va être fou? Et, joliment transformé.
scraper = [
["hatenablog.com","div","class","entry-content"],
["qiita.com","section","itemprop", "articleBody"]
]
numHash = {}
for i in range(len(scraper)):
numHash[scraper[i][0]] = i
for domain in scraper:
print url, domain[0]
if re.search( domain[0], url):
c = numHash[domain[0]]
break
Le script est devenu plus long que prévu. Mais j'aime beaucoup celui-ci. Je me demande si je peux le rendre un peu plus propre.
Donc, cette fois, j'ai fait une correction auto-satisfaisante. La prochaine fois, je pense que je passerai à la suivante. Scraping de liens et de listes de balises pour apprendre. Quand arriverons-nous à l'apprentissage automatique? .. .. C'est sur le point d'être qualifié de fraude.
Recommended Posts