如何从HTML页面内容文本格式保存中仅提取主要文本内容

扫码加入我们
& 2017 内容协议如何获取HTML中用户输入到文本框中的内容?_百度知道
如何获取HTML中用户输入到文本框中的内容?
我有更好的答案
获取文本框中的内容有以下两种方法:假设为如下文本框:&input&type=&text&&value=&&&id=&text&&1、原生JS获取文本框的值:document.getElementById(&text&).value&&//text为文本框的id2、jquery获取文本框的值:$(&#text&).val()
前端开发工程师
&meta http-equiv=content-type content="text/charset=GBK"&
&input id="txt"/&
&input type="button" value="提交" onclick="sub()"&
function sub(){
var content = document.getElementById("txt");
alert(content.value);
&/script&&/html&
来自:求助得到的回答
本回答被提问者采纳
用 value 属性获取:inputElem.value
获取文本框的内容有以下两种方法:首先假设文本框如下:&input type=&text& value=&& id=&textId&&1.用js获取文本框的值:document.getElementById(&textId&).value
//textId为文本框的id2.用jquery获取文本框的值:$(&#textId&).val()
其他1条回答
为您推荐:
其他类似问题
文本框的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出 - eternal1025 - 博客园
随笔 - 121, 文章 - 0, 评论 - 1, 引用 - 0
创建一个新网站,一开始没有内容,通常需要抓取其他人的网页内容,一般的操作步骤如下:
根据url下载网页内容,针对每个网页的html结构特征,利用正则表达式,或者其他的方式,做文本解析,提取出想要的正文。
为每个网页写特征分析这个还是太耗费开发的时间,我的思路是这样的。
Python的BeautifulSoup包大家都知道吧,
import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
利用这个包先把html里script,style给清理了:
[script.extract() for script in soup.findAll('script')]
[style.extract() for style in soup.findAll('style')]
清理完成后,这个包有一个prettify()函数,把代码格式给搞的标准一些:
soup.prettify()
然后用正则表达式,把所有的HTML标签全部清理了:
reg1 = re.compile("&[^&]*&")
content = reg1.sub('',soup.prettify())
剩下的都是纯文本的文件了,通常是一行行的,把空白行给排除了,这样就会知道总计有多少行,每行的字符数有多少,我用excel搞了一些每行字符数的统计,如下图:
x坐标为行数,y坐标为该行的字符数
很明显,会有一个峰值,81~91行就应该是这个网页的正文部分。我只需要提取81~91行的文字就行了。
问题来了,照着这个思路,有什么好的算法能够通过数据分析的方式统计出长文本的峰值在哪几行?
BeautifulSoup不仅仅只是可以查找,定位和修改文档内容,同样也可以用一个好的 格式进行输出显示。BeautifulSoup可以处理不同类型的输出:
格式化的输出
非格式化的输出
格式化输出
BeautifulSoup中有内置的方法prettfy()来实现格式化输出。比如:
from&bs4&import&BeautifulSoup
html_markup&=&
soup&=&BeautifulSoup(html_markup,“lxml”)
print(soup.prettify())
prettify()可以用于BeautifulSoup对象也可以用于任何标签对象。比如:
producer_entry&=&soup.ul
print(producer_entry.prettify())
非格式化输出
可以使用str()和unicode()来进行非格式化输出。
如果我们对BeautifulSoup对象和标签对象使用str()方法,那么得到的就是一般的字符串输出样式。
我们也可以使用前篇讲到的encode()方法来指定编码格式的输出。
对BeautifulSoup对象或标签对象使用decode()方法来得到Unicode字符串。
BeautifulSoup中的输出格式化
HTML实体编码可以放进HTML文档中用来表示特别的字符和标识。这些标识不存在于键盘上,这些HTML实体编码只是当浏览器打开后才回看到效果。
在输出方法中,只有这几个HTML编码有点例外。&和&和&三个符号。除此之外其他的特别标识都是被转换成Unicode编码当创建BeautifulSoup对象时,且当使用Prettify()方法或者其他方法输出时,我们只能得到UTF-8格式的字符串。
html_markup = “””&html&&body&& & ampersand? & cent(C) & copyright÷ & divide& & greater than&/body&&/html&
可以看到两个没有被转换。BeautifulSoup自带的输出格式器来控制输出。输出格式器有以下几种类型。
我们可以在输出方法中传递上述输出格式器参数,如prettify(),ncode(),decode()
miimal格式化
在这种格式化模式下,字符串被处理成一个有效的HTML代码。这是默认的格式化输出,此时输出结果就和前面的一样。不能转换&,&&和&
Html格式化
这种格式化模式下,BeautifulSoup将会将Unicode字符转换成HTML编码形式。print(soup.prettify(formatter=”html”))
None格式化
这种情况下,BeautifulSoup不会改变字符串。这会导致产生一个非法的HTML代码。
print(soup.prettify(formatter=None))
函数格式化
我们可以定义一个函数来处理字符串。比如去掉a字符。
def&remove_chara(markup):
&&&&return&markup.replace(“a”,””)
soup&=&BeautifulSoup(html_markup,“lxml”)
print(soup.prettify(formatter=remove_chara))
注意,其中字符a被替换掉了,但是注意的是&, &,和&也被转换了。
使用get_text()
从网页中得到文本是常见的工作,BeautifulSoup提供了get_text()方法来达到目的。
如果我们只想得到BeautifulSoup对象的文本或标签对象的文本内容,我们可以使用get_text()方法。比如:
html_markup&=&
soup&=&BeautifulSoup(html_markup,“lxml”)
print(soup.get_text())
plants100000
algae100000
get_text()方法返回BeautifulSoup对象或标签对象中的文本内容,其为一个Unicode字符串。但是get_text()有个问题是它同样也会返回javascript代码。
去掉javascript代码的方法如下:
[x.extract()&for&x&in&soup_packtpage.find_all(‘script’)]
这样就会用处掉所有脚本元素。[译] 如何从网页中获取主要文本信息
[译] 如何从网页中获取主要文本信息
解析HTML页面不算难事, 开源库Beautiful Soup就给你提供了紧凑直观的接口来处理网页, 让你使用喜欢的语言去实现. 但这也仅仅是第一步. 更有趣的问题是: 怎么才能把有用的信息(主题内容)从网页中抓取出来?
我在过去的几天里一直在尝试回答这个问题, 以下是我找到的.
Arc90 Readability
我最喜欢的方法是叫做 Arc90 Readability 的算法. 由 Arc90 Labs 开发, 目的是用来使网页阅读更佳舒适(例如在移动端上). 你可以找到它的chrome plugin. 整个项目放在Google Code上, 但更有趣的是它的算法, Nirmal Patel用python实现了这个算法, 源码在这里.
整个算法基于HTML-ID-names和HTML-CLASS-names生成了2个列表. 一个是包含了褒义IDs和CLASSes, 一个列表包含了贬义IDs和CLASSes. 如果一个tag有褒义的ID和CLASS, 那么它会得到额外的分数. 反之,如果它包含了贬义的ID和CLASS则丢分. 当我们算完了所有的tag的分数之后, 我们只需要渲染出那些得分较高的tags, 就得到了我们想要的内容.例子如下:
&div id="post"&&h1&My post&/h1&&p&...&/p&&/div&
&div class="footer"&&a...&Contact&/a&&/div&
第一个div tag含有一个褒义的ID (“id"=“post”), 所以很有可能这个tag包含了真正的内容(post). 然而, 第二行的tag footer是一个贬义的tag, 我们可以认为这个tag所包含的东西不是我们想要的真正内容. 基于以上, 我们可以得到如下方法:
在HTML源码里找到所有的p tag(即paragraph)
对于每一个paragraph段落:
把该段落的父级标签加入到列表中
并且把该父级标签初始化为0分
如果父级标签包含有褒义的属性, 加分
如果父级标签包含有贬义的属性, 减分
可选: 加入一些额外的标准, 比如限定tag的最短长度
找到得分最多的父级tag
渲染得分最多的父级tag
这里我参考了Nirmal Patel的代码, 写了一个简单的实现. 主要的区别是: 我在算法之前, 写了一个用来清除杂项的代码. 这样最终会得到一个没有脚本, 图片的文本内容, 就是我们想要的网页内容.
from bs4 import BeautifulSoup
from bs4 import Comment
from bs4 import Tag
NEGATIVE = re.compile(".*comment.*|.*meta.*|.*footer.*|.*foot.*|.*cloud.*|.*head.*")
POSITIVE = re.compile(".*post.*|.*hentry.*|.*entry.*|.*content.*|.*text.*|.*body.*")
BR = re.compile("&br */? *&[ rn]*&br */? *&")
def extract_content_with_Arc90(html):
soup = BeautifulSoup( re.sub(BR, "&/p&&p&", html) )
soup = simplify_html_before(soup)
topParent = None
parents = []
for paragraph in soup.findAll("p"):
parent = paragraph.parent
if (parent not in parents):
parents.append(parent)
parent.score = 0
if (parent.has_key("class")):
if (NEGATIVE.match(str(parent["class"]))):
parent.score -= 50
elif (POSITIVE.match(str(parent["class"]))):
parent.score += 25
if (parent.has_key("id")):
if (NEGATIVE.match(str(parent["id"]))):
parent.score -= 50
elif (POSITIVE.match(str(parent["id"]))):
parent.score += 25
if (len( paragraph.renderContents() ) & 10):
parent.score += 1
# you can add more rules here!
topParent = max(parents, key=lambda x: x.score)
simplify_html_after(topParent)
return topParent.text
def simplify_html_after(soup):
for element in soup.findAll(True):
element.attrs = {}
if( len( element.renderContents().strip() ) == 0 ):
element.extract()
return soup
def simplify_html_before(soup):
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
# you can add more rules here!
map(lambda x: x.replaceWith(x.text.strip()), soup.findAll("li"))
# tag to text
map(lambda x: x.replaceWith(x.text.strip()), soup.findAll("em"))
# tag to text
map(lambda x: x.replaceWith(x.text.strip()), soup.findAll("tt"))
# tag to text
map(lambda x: x.replaceWith(x.text.strip()), soup.findAll("b"))
# tag to text
replace_by_paragraph(soup, 'blockquote')
replace_by_paragraph(soup, 'quote')
map(lambda x: x.extract(), soup.findAll("code"))
# delete all
map(lambda x: x.extract(), soup.findAll("style"))
# delete all
map(lambda x: x.extract(), soup.findAll("script"))
# delete all
map(lambda x: x.extract(), soup.findAll("link"))
# delete all
delete_if_no_text(soup, "td")
delete_if_no_text(soup, "tr")
delete_if_no_text(soup, "div")
delete_by_min_size(soup, "td", 10, 2)
delete_by_min_size(soup, "tr", 10, 2)
delete_by_min_size(soup, "div", 10, 2)
delete_by_min_size(soup, "table", 10, 2)
delete_by_min_size(soup, "p", 50, 2)
return soup
def delete_if_no_text(soup, tag):
for p in soup.findAll(tag):
if(len(p.renderContents().strip()) == 0):
p.extract()
def delete_by_min_size(soup, tag, length, children):
for p in soup.findAll(tag):
if(len(p.text) & length and len(p) &= children):
p.extract()
def replace_by_paragraph(soup, tag):
for t in soup.findAll(tag):
t.name = “p"
t.attrs = {}
空格符渲染
这个方法是主要思路很简单: 把HTML源码里面的所有tag (所有在&和&之间的代码) 用空格符代替. 当你再次渲染网页的时候, 所有的文本块(text block)依然是”块”状, 但是其他部分变成了包含很多空格符的分散的语句. 你剩下唯一要做的就是把文本快给找出来, 并且移除掉所有其他的内容.
我写了一个简单的实现.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from bs4 import Comment
if __name__ == "__main__":
html_string = requests.get('http://www.zdnet.com/windows-8-microsofts-new-coke-moment-/').text
soup = BeautifulSoup(str( html_string ))
map(lambda x: x.extract(), soup.findAll("code"))
map(lambda x: x.extract(), soup.findAll("script"))
map(lambda x: x.extract(), soup.findAll("pre"))
map(lambda x: x.extract(), soup.findAll("style"))
map(lambda x: x.extract(), soup.findAll("embed"))
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
white_string = ""
for character in soup.prettify():
if character == "&":
white_string += " "
white_string += character
if character == "&":
for string in white_string.split("
# tune here!
p = string.strip()
p = re.sub(' +',' ', p)
p = re.sub('n+',' ', p)
if( len( p.strip() ) & 50):
print p.strip()
这里有个问题是, 这个方法不是很通用. 你需要进行参数调优来找到最合适空格符长度来分割得到的字符串. 那些带有大量markup标记的网站通常要比普通网站有更多的空格符. 除此之外, 这个还是一个相当简单有效的方法.
开源社区的库
有句话说: 不要重新造轮子. 事实上有很多的开源库可以解决网页内容抓取的问题. 我最喜欢的是Boilerpipe. 你可以在这里找到它的web服务(demo), 以及它的JAVA实现. 相比较上面2个简单的算法, 它真的很有用, 代码也相对更复杂. 但是如果你只把它当做黑盒子使用, 确实是一个非常好的解决方法.
Best regards,
Thomas Uhrig
1. 介绍 浏览器可能是最广泛使用的软件。本书将介绍浏览器的工作原理。我们将看到,当你在地址栏中输入google.com直到你看到Google页面,这个过程都发生了什么。 1.1 本文将讨论的浏览器 现在有五种主流浏览器——Internet Explorer,Firefox...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注www.itbaizhan.com 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
不知道各位宝宝喜不喜欢小动物,女神借可喜欢啦,哈哈,尤其是二哈。现在小狗小猫越来越成为人们生活中的一部分,也许已经有人开始实施女神姐今天要说的是这个项目啦,但是有些也许你们并没有想到。不得不说现在的宠物市场越来越好啦,已经开始向着互联网进军。只要和互联网有关系,女神姐都愿意...
苏州常熟新颜街的樱花开了, 好多人去赏花, 前天我俩去踩了个点。 像我和丫头这么懒的人, 睡了个自然醒后才去, 所以等我们去了发现全是人人人人人人, 我们只能在赏过一遍花和赏花人之后, 找了个人少花也少的地方拍了两张, 然后撤退。 当时我说改天一大清早去拍两张试试看,丫头说...
台风尼伯特总算离开福建了,连日的暴雨过后,炎炎的夏日透着一丝小清凉。今天是周末,可我还得上班去,心情真心不咋滴。 匆匆吃了早饭,在等电梯的时候,来了一对母子,妈妈左手右手拎着满满两大袋东西,一个小男孩看着4岁左右吧,手里拎着个小塑料桶,盯着妈妈手里的东西,“妈妈,我再帮你拿...
1.界面布局,以及相关功能 点击中间开始录音,点击左上角播放或暂停播放,点击右上角移除文件 2.定义相关属性 #import &SendVoiceController.h& #import#import &RecordVoiceView.h& #import &lame.h...请教如何使用java从html内容中提取指定信息_百度知道
请教如何使用java从html内容中提取指定信息
有如下网页中内容HTML:
&div id=&bdshare& log-set-param=&view_sharetop& class=&bdshare_t bds_tools get-codes-bdshare bk_share log-set-param& data=&{'url':'http://baike.baidu.com/view/582.htm','text':'【NBA_百度百科】NBA(全称National Basket...
即希望取得红色箭头指向的蓝色区域。。。求救。。
我有更好的答案
Jsoup这个处理 html的库Document doc
= Jsoup.parseBodyFragment(&&class&123&br& &class&acx&br& &class&a12a&br&&);String text = doc.select(&class&).first().text(); // 123 acx a12a
毅衣公司京东小二
File input = new File(&/tmp/input.html&); Document doc = Jsoup.parse(input, &UTF-8&, &IP&);看看这个代码,调用 doc.text() 方法即可。
本回答被网友采纳
正则表达是可以满足你
本回答被提问者采纳
为您推荐:
其他类似问题
您可能关注的内容
java的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 批处理提取文本内容 的文章

 

随机推荐