2016-05-04 12 views
2

Ich versuche, den Inhalt des Artikels von einer Website zugreifen, mit dem folgenden Code beautifulsoup:Python, entfernen Sie alle HTML-Tags aus string

site= 'www.example.com' 
page = urllib2.urlopen(req) 
soup = BeautifulSoup(page) 
content = soup.find_all('p') 
content=str(content) 

das Inhaltsobjekt alle Haupttext der Seite enthält, ist innerhalb des "p" -Tags, jedoch sind noch andere Tags innerhalb der Ausgabe vorhanden, wie in dem Bild unten zu sehen ist. Ich möchte alle Zeichen entfernen, die in übereinstimmenden Paaren von <> -Tags und den Tags selbst enthalten sind. so dass nur der Text übrig bleibt.

Ich habe die folgende Methode versucht, aber es scheint nicht zu funktionieren.

' '.join(item for item in content.split() if not (item.startswith('<') and item.endswith('>'))) 

Was ist der beste Weg, um Teilstrings in einem Stachel zu entfernen? dass beginnen und mit einem bestimmten Muster enden wie <>

enter image description here

Antwort

3

Sie get_text()

for i in content: 
    print i.get_text() 

Beispiel unten verwenden könnte, ist aus die docs:

>>> markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>' 
>>> soup = BeautifulSoup(markup) 
>>> soup.get_text() 
u'\nI linked to example.com\n' 
1

Sie müssen die strings generator verwenden:

for text in content.strings: 
    print(text) 
7

Mit REGEX:

re.sub('<[^<]+?>', '', text) 

BeautifulSoup verwenden: (Lösung von here)

import urllib 
from bs4 import BeautifulSoup 

url = "http://news.bbc.co.uk/2/hi/health/2284783.stm" 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html) 

# kill all script and style elements 
for script in soup(["script", "style"]): 
    script.extract() # rip it out 

# get text 
text = soup.get_text() 

# break into lines and remove leading and trailing space on each 
lines = (line.strip() for line in text.splitlines()) 
# break multi-headlines into a line each 
chunks = (phrase.strip() for line in lines for phrase in line.split(" ")) 
# drop blank lines 
text = '\n'.join(chunk for chunk in chunks if chunk) 

print(text) 

NLTK Verwendung:

import nltk 
from urllib import urlopen 
url = "https://stackoverflow.com/questions/tagged/python"  
html = urlopen(url).read()  
raw = nltk.clean_html(html) 
print(raw) 
0

Pyparsing macht es einfach, einen HTML-Stripper schreiben von Definieren eines Musters, das mit allen öffnenden und schließenden HTML-Tags übereinstimmt, und dann t Transformieren der Eingabe unter Verwendung dieses Musters als einen Unterdrücker. Dies lässt noch die &xxx; HTML-Entitäten umgewandelt werden - Sie xml.sax.saxutils.unescape verwenden können, das zu tun:

source = """ 
<p><strong>Editors' Pick: Originally published March 22.<br /> <br /> Apple</strong> <span class=" TICKERFLAT">(<a href="/quote/AAPL.html">AAPL</a> - <a href="http://secure2.thestreet.com/cap/prm.do?OID=028198&amp;ticker=AAPL">Get Report</a><a class=" arrow" href="/quote/AAPL.html"><span class=" tickerChange" id="story_AAPL"></span></a>)</span> is waking up the echoes with the reintroduction of a&nbsp;4-inch iPhone, a model&nbsp;its creators hope will lead the company to victory not just in emerging markets, but at home as well.</p> 
<p>&quot;There's significant pent-up demand within Apple's base of iPhone owners who want a smaller iPhone with up-to-date specs and newer features,&quot; Jackdaw Research Chief Analyst Jan Dawson said in e-mailed comments.</p> 
<p>The new model, dubbed the iPhone SE, &quot;should unleash a decent upgrade cycle over the coming months,&quot; Dawson said.&nbsp;Prior to the iPhone 6 and 6 Plus, introduced in 2014, Apple's iPhones were small, at 3.5 inches and 4 inches tall, respectively, compared with models by Samsung and others that approached 6 inches.</p> 
<div class=" butonTextPromoAd"> 
<div class=" ym" id="ym_44444440"></div>""" 

from pyparsing import anyOpenTag, anyCloseTag 
from xml.sax.saxutils import unescape as unescape 
unescape_xml_entities = lambda s: unescape(s, {"&apos;": "'", "&quot;": '"', "&nbsp;":" "}) 

stripper = (anyOpenTag | anyCloseTag).suppress() 

print(unescape_xml_entities(stripper.transformString(source))) 

gibt:

Editors' Pick: Originally published March 22. Apple (AAPL - Get Report) is waking up the echoes with the reintroduction of a 4-inch iPhone, a model its creators hope will lead the company to victory not just in emerging markets, but at home as well. 
"There's significant pent-up demand within Apple's base of iPhone owners who want a smaller iPhone with up-to-date specs and newer features," Jackdaw Research Chief Analyst Jan Dawson said in e-mailed comments. 
The new model, dubbed the iPhone SE, "should unleash a decent upgrade cycle over the coming months," Dawson said. Prior to the iPhone 6 and 6 Plus, introduced in 2014, Apple's iPhones were small, at 3.5 inches and 4 inches tall, respectively, compared with models by Samsung and others that approached 6 inches. 

(Und in Zukunft, geben Sie bitte nicht Beispieltext oder Code als nicht - kopierfähige Bilder.)

0

Wenn Sie die Verwendung einer Bibliothek eingeschränkt haben, können Sie einfach den folgenden Code zum Entfernen von HTML-Tags verwenden.

ich korrigiere nur, was Sie versucht haben. danke für die Idee

content="<h4 style='font-size: 11pt; color: rgb(67, 67, 67); font-family: arial, sans-serif;'>Sample text for display.</h4> <p>&nbsp;</p>" 


' '.join([word for line in [item.strip() for item in content.replace('<',' <').replace('>','> ').split('>') if not (item.strip().startswith('<') or (item.strip().startswith('&') and item.strip().endswith(';')))] for word in line.split() if not (word.strip().startswith('<') or (word.strip().startswith('&') and word.strip().endswith(';')))]) 
Verwandte Themen