对于想了解使用htmlparserpython获取标签下的html的读者,本文将提供新的信息,我们将详细介绍python获取html标签的内容,并且为您提供关于c#–如何使用htmlagilitypa
对于想了解使用htmlparser python获取标签下的html的读者,本文将提供新的信息,我们将详细介绍python获取html标签的内容,并且为您提供关于c# – 如何使用htmlagilitypack获取2个周围html元素之间的html?、html.parser - 简单的HTML和XHTML 解析器、Java HtmlParse提取标签中的值操作、java利用htmlparser获取html中想要的代码具体实现的有价值信息。
本文目录一览:- 使用htmlparser python获取标签下的html(python获取html标签的内容)
- c# – 如何使用htmlagilitypack获取2个周围html元素之间的html?
- html.parser - 简单的HTML和XHTML 解析器
- Java HtmlParse提取标签中的值操作
- java利用htmlparser获取html中想要的代码具体实现
使用htmlparser python获取标签下的html(python获取html标签的内容)
我想在标签下并使用HTMLParser获得整个html。我目前能够获取标签之间的数据,以下是我的代码
class LinksParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.recording = 0
self.data = ''
def handle_starttag(self,tag,attributes):
if tag != 'span':
return
if self.recording:
self.recording += 1
return
for name,value in attributes:
if name == 'itemprop' and value == 'description':
break
else:
return
self.recording = 1
def handle_endtag(self,tag):
if tag == 'span' and self.recording:
self.recording -= 1
def handle_data(self,data):
if self.recording:
self.data += data
我也想要输入中的html标签,例如
<span itemprop="description">
<h1>My First Heading</h1>
<p>My first <br/><br/>paragraph.</p>
</span>
当作为输入提供时,只会给我没有标签的数据。有什么方法可以让我在标记之间获得整个html?
c# – 如何使用htmlagilitypack获取2个周围html元素之间的html?
举个例子,我有以下几点:
<div id="div1"https://www.jb51.cc/tag/Finitio/" target="_blank">Finition here"> <strong> <font face="Verdana" size="2">Your search request retrieved 0 matches.</font> </strong> <font face="Verdana" size="2">Some more text here.</font> <br><br> <!--more html here--> </div>
我想把它们之间的一切都归还
<div id="div1">
和第一个
<br>
没有返回这些元素.
我无法理解为此所需的语法,所以如果有人能够向我解释在忽略结束标记的同时获得其他两个已知开始标记之间存在的html的最佳方法,我会非常感激.
我还要提一下,我需要首先在完整网页的周围html中找到div为id的div.
我不需要实际节点与来自特定HtmlDocument的节点具有引用相等性,它们只需要在内容方面相同.
解决方法
基本上,您将获得所有元素的后代,直到相关节点为止.您选择要从以下位置开始的节点:
HtmlNode divNode = doc.DocumentNode.SelectSingleNode("div[@id='div1']");
要升级的节点:
// Note that in this case,working off the first node is not necessary,just // convenient for this example. HtmlNode brNode = divNode.SelectSingleNode("br");
然后使用Enumerable
class上的TakeWhile
extension method将所有元素提取到第二个元素,如下所示:
// The nodes. IEnumerable<HtmlNode> nodes = divNode.Descendants(). TakeWhile(n => n != brNode). Where(n => n.NodeType == HtmlNodeType.Element);
这是TakeWhile方法(n => n!= brNode)中的比较,它取决于参考比较(这是实现细节部分).
最后一个过滤器只为您提供元素节点,因为这是您调用SelectSingleNode时通常会得到的;如果要处理其他节点类型,可以省略它.
循环遍历这些节点,如下所示:
foreach (HtmlNode node in nodes) { // Print. Console.WriteLine("Node: {0}",node.Name); }
生产:
Node: strong Node: font Node: font
html.parser - 简单的HTML和XHTML 解析器
该模块定义了一个名为 HTMLParser的类,用于解析html和xhml格式的文本文件
class html.parser.HTMLParser(*,convert_charrefs=True)
创建一个解析器实例来解析无用的标记
convert_charrefs (该参数默认是True )为True时,所有字符引用(脚本/样式元素除外)都会自动转换为相应的Unicode字符
当遇到开始标签、结束标签,文本,注释和其他标记元素时,HTMLParser实例将调用处理方法处理HTML数据,读者应该继承HTMLParser类并重写它的方法来实现自己想要的解析方式
这个解析器不检查结束标签是否与开始标签匹配,或者通过关闭外部元素来隐式素调用结束标记处理方法
程序示例
下面是一个简单的示例,使用HTMLParser 类来输出开始标签,结束标签和数据
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Encountered a start tag:", tag)
def handle_endtag(self, tag):
print("Encountered an end tag :", tag)
def handle_data(self, data):
print("Encountered some data :", data)
parser = MyHTMLParser()
parser.feed(''<html><head><title>Test</title></head>''
''<body><h1>Parse me!</h1></body></html>'')
输出结果:
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html
解析类方法简介:
HTMLParser.feed(data)
将一些文本数据提供给解析器。只要其由完整的元素组成就能被处理;缓存不完整的数据,直到输入更多数据或者调用close()。数据必须是str类型
HTMLParser.close()
强制处理所有的缓冲数据,就像这些数据后面有一个文件结束符一样;该方法可以由派生类重新定义,以在输入的末尾定义附加处理,但重新定义的版本应始终调用HTMLParser基类方法的close()
HTMLParser.reset()
重置实例。丢失所有未处理的数据,这在实例化时隐式调用。
HTMLParser.getpos()
返回当前行号和偏移量
HTMLParser.get_starttag_text()
返回最近打开的开始标签的文本。结构化处理通常不需要这样做,但在处理HTML“部署”或重新生成具有最小更改的输入(可以保留属性之间的空白等)时可能很有用。
遇到数据或标记元素时会调用以下方法,并且要在子类中重新他们,基类中的实现什么都不做(handle_startendtag()除外)
HTMLParser.handle_starttag(tag, attrs)
该方法处理开始标签时调用(例如 <div id="main">)
tag参数是转换为小写的标签名称
attrs参数是(name, vaule)对的列表,包含在标签的<>内的熟悉
name被转为小写,并删除值中的引号,并且已替换字符和实体引用
例如 对于标签<A HREF="https://www.cwi.nl/"> 方法将会handle_starttag(''a'', [(''href'', ''https://www.cwi.nl/'')])来处理
来着html.entities的所有实体引用都将替换为属性值
HTMLParser.handle_endtag(tag)
该方法处理结束标签 例如</div>
tag参数是转换为小写的标签名称
HTMLParser.handle_startendtag(tag, attrs)
和函数 HTMLParser.handle_starttag() 相似,但是当解析器遇到一个 XHTML格式的空标签时(<img .../>),该方法可能需要子类重写,当需要特定的词汇信息,默认实现只调用handler_starttag()和handler_endtag()
HTMLParser.handle_data(data)
调用该方法来处理任意数据(文本节点和<script>...</script>
和 <style>...</style>中的内容
)
HTMLParser.handle_entityref(name)
调用此方法来处理表单和名称的命名字符引用;(>)其中name是一般实体引用()如果convert_charrefs为True 该方法永远不会被调用
HTMLParser.handle_charref(name)
调用此方法来处理形式为&#NNN的十进制和十六进制数字字符引用&#xNNN.例如,&gt;的十进制等效值是>,而十六进制是>在这种情况下,该方法将接收''62''或''x3E''。
HTMLParser.handle_comment(data)
遇到注释时会调用此方法(<!--comment-->)
例如,注释<!—-comment-—>将导致使用参数''comment''调用此方法
Internet Explorer条件注释(condcoms)的内容也将发送到此方法,因此,对于<! - [if IE 9]> IE9特定内容<![endif] - >,此方法将收到''[如果IE 9]> IE9特定内容<![endif]''。
HTMLParser.handle_decl(decl)
调用此方法来处理HTML doctype声明(例如<!DOCTYPE html>)。
decl参数将是<!...>标记内声明的全部内容(例如''DOCTYPE html'')
HTMLParser.handle_pi(data)
遇到处理指令时调用此方法。data参数将包含整个处理指令。例如,对于处理指令<?proc color =''red''>,此方法将被调用handle_pi("proc color =''red''")
HTMLParser.unknown_decl(data)
当解析器读取无法识别的声明时,将调用此方法。
data参数将是<![...]>标记内声明的全部内容。由派生类重写有时很有用。
以下类实现了一个解析器
from html.parser import HTMLParser
from html.entities import name2codepoint
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Start tag:", tag)
for attr in attrs:
print(" attr:", attr)
def handle_endtag(self, tag):
print("End tag :", tag)
def handle_data(self, data):
print("Data :", data)
def handle_comment(self, data):
print("Comment :", data)
def handle_entityref(self, name):
c = chr(name2codepoint[name])
print("Named ent:", c)
def handle_charref(self, name):
if name.startswith(''x''):
c = chr(int(name[1:], 16))
else:
c = chr(int(name))
print("Num ent :", c)
def handle_decl(self, data):
print("Decl :", data)
parser = MyHTMLParser()
解析doctype
>>> parser.feed(''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" ''
... ''"http://www.w3.org/TR/html4/strict.dtd">'')
Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"
解析具有一些属性和标题的元素
>>> parser.feed(''<img src="python-logo.png" alt="The Python logo">'')
Start tag: img
attr: (''src'', ''python-logo.png'')
attr: (''alt'', ''The Python logo'')
>>>
>>> parser.feed(''<h1>Python</h1>'')
Start tag: h1
Data : Python
End tag : h1
脚本和样式元素的内容按原样返回,无需进一步解析
>>> parser.feed(''<style type="text/css">#python { color: green }</style>'')
Start tag: style
attr: (''type'', ''text/css'')
Data : #python { color: green }
End tag : style
>>> parser.feed(''<script type="text/javascript">''
... ''alert("<strong>hello!</strong>");</script>'')
Start tag: script
attr: (''type'', ''text/javascript'')
Data : alert("<strong>hello!</strong>");
End tag : script
解析注释
>>> parser.feed(''<!-- a comment -->''
... ''<!--[if IE 9]>IE-specific content<![endif]-->'')
Comment : a comment
Comment : [if IE 9]>IE-specific content<![endif]
解析命名和数字字符引用并将它们转换为正确的char(注意:这3个引用都等同于''>'')
>>> parser.feed(''>>>'')
Named ent: >
Num ent : >
Num ent : >
将不完整的块提供给feed()可以工作,但handle_data()可能会被多次调用:
>>> for chunk in [''<sp'', ''an>buff'', ''ered '', ''text</s'', ''pan>'']:
... parser.feed(chunk)
...
Start tag: span
Data : buff
Data : ered
Data : text
End tag : span
解析无效的HTML(例如,未引用的属性)也有效:
>>> parser.feed(''<p><a class=link href=#main>tag soup</p ></a>'')
Start tag: p
Start tag: a
attr: (''class'', ''link'')
attr: (''href'', ''#main'')
Data : tag soup
End tag : p
End tag : a
Java HtmlParse提取标签中的值操作
这篇文章主要介绍了Java HtmlParse提取标签中的值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
☆代码示例:
代码块语法遵循标准markdown代码,例如:
package cas; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.StringFilter; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tags.ImageTag; import org.htmlparser.util.NodeList; /** * Html 中的body体中提取出img标签中的src值 * * @author XY * */ public class CASHtmlImgConvert { public static void main(String[] args) { //演示 String[] oldSrcPath=changeImgSrc(""); if(oldSrcPath!=null){ for(String str:oldSrcPath){ System.out.println(str); } } } public static boolean isEmpty(String str){ if(str!=null&&(!str.equals(""))) return false; else return true; } /** * * @param htmlPath 本地的html路径 或者body */ private static String[] changeImgSrc(String htmlPath) { StringBuilder oldSrcPath = new StringBuilder(); try { Parser parser = new Parser(htmlPath); //标签名过滤器 NodeFilter filter = new TagNameFilter ("img"); NodeList nodes = parser.extractAllNodesThatMatch(filter); Node eachNode = null; ImageTag imageTag = null; if (nodes != null) { // 遍历所有的img节点 for (int i = 0; i
补充知识:java 扫描HTML 拿取各种标签资源数据
直接上代码,不比比。
package com.zhirui.oa.modules.notice.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TemplateUtil { public static List> getImgSrc(String htmlContent) { List> srcList = new ArrayList(); //用来存储获取到的地址 Map map = null; Pattern p = Pattern.compile("|>|/>)");//匹配字符串中的img标签 Matcher matcher = p.matcher(htmlContent); boolean hasPic = matcher.find(); if (hasPic == true)//判断是否含有图片 { while (hasPic) //如果含有图片,那么持续进行查找,直到匹配不到 { String group = matcher.group(2);//获取第二个分组的内容,也就是 (.*?)匹配到的 Pattern srcText = Pattern.compile("(src|SRC)=("|')(.*?)("|')");//匹配图片的地址 Matcher matcher2 = srcText.matcher(group); if (matcher2.find()) { map = new HashMap(); map.put("imgResourcePath", matcher2.group(3)); srcList.add(map);//把获取到的图片地址添加到列表中 map = null; } hasPic = matcher.find();//判断是否还有img标签 } } return srcList; } public static List> getVideoSrc(String htmlContent) { List> srcList = new ArrayList(); //用来存储获取到的视频地址 Map map = null; Pattern p = Pattern.compile("|>|/>)");//匹配字符串中的video标签 Matcher matcher = p.matcher(htmlContent); boolean hasPic = matcher.find(); if (hasPic == true)//判断是否含有视频 { while (hasPic) //如果含有视频,那么持续进行查找,直到匹配不到 { String group = matcher.group(2);//获取第二个分组的内容,也就是 (.*?)匹配到的 Pattern srcText = Pattern.compile("(src|SRC)=("|')(.*?)("|')");//匹配视频的地址 Matcher matcher2 = srcText.matcher(group); if (matcher2.find()) { map = new HashMap(); map.put("videoResourcePath", matcher2.group(3)); srcList.add(map);//把获取到的视频地址添加到列表中 map = null; } hasPic = matcher.find();//判断是否还有video标签 } } return srcList; } public static List> getAhref(String htmlContent) { List> srcList = new ArrayList(); //用来存储获取到的超链接地址 Map map = null; Pattern p = Pattern.compile("|>|/>)");//匹配字符串中的a标签 Matcher matcher = p.matcher(htmlContent); boolean hasPic = matcher.find(); if (hasPic == true)//判断是否含有超链接 { while (hasPic) //如果含有超链接,那么持续进行查找,直到匹配不到 { String group = matcher.group(2);//获取第二个分组的内容,也就是 (.*?)匹配到的 Pattern srcText = Pattern.compile("(href|HREF)=("|')(.*?)("|')");//匹配超链接的地址 Matcher matcher2 = srcText.matcher(group); if (matcher2.find()) { map = new HashMap(); map.put("aResourcePath", matcher2.group(3)); srcList.add(map);//把获取到的超链接地址添加到列表中 map = null; } hasPic = matcher.find();//判断是否还有a标签 } } return srcList; } }
以上这篇Java HtmlParse提取标签中的值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小编。
java利用htmlparser获取html中想要的代码具体实现
这两天需要做一些东西,需要抓取别人网页中的一些信息。最后用htmlparser来解析html。
直接从代码中看吧:
首先需要注意导入包为:import org.htmlparser下面的包
List<Mp3> mp3List = new ArrayList<Mp3>();
try{
Parser parser = new Parser(htmlStr);//初始化Parser,这里要注意导入包为org.htmlparser。这里参数有很多。这个地方我写的是提前获取好的html文本。也可以传入URl对象
parser.setEncoding("utf-8");//设置编码机
AndFilter filter =
new AndFilter(
new TagNameFilter("div"),
new HasAttributeFilter("id","songListWrapper")
);//通过filter找到div且div的id为songListWrapper
NodeList nodes = parser.parse(filter);//通过filter获取nodes
Node node = nodes.elementAt(0);
NodeList nodesChild = node.getChildren();
Node[] nodesArr = nodesChild.toNodeArray();
NodeList nodesChild2 = nodesArr[1].getChildren();
Node[] nodesArr2 = nodesChild2.toNodeArray();
Node nodeul = nodesArr2[1];
Node[] nodesli = nodeul.getChildren().toNodeArray();//解析出nodesli为想要的
for(int i=2;i<nodesli.length;i++){
//System.out.println(nodesli[i].toHtml());
Node tempNode = nodesli[i];
TagNode tagNode = new TagNode();//通过TagNode获得属性,只有将Node转换为TagNode才能获取某一个标签的属性
tagNode.setText(tempNode.toHtml());
String claStr = tagNode.getAttribute("class");//claStr为bb-dotimg clearfix song-item-hook { 'songItem': { 'sid': '113275822','sname': '我的要求不算高','author': '黄渤' } }
claStr = claStr.replaceAll(" ","");
if(claStr.indexOf("\\?")==-1){
Pattern pattern = Pattern.compile("[\\s\\wa-z\\-]+\\{'songItem':\\{'sid':'([\\d]+)','sname':'([\\s\\S]*)','author':'([\\s\\S]*)'\\}\\}");
Matcher matcher = pattern.matcher(claStr);
if(matcher.find()){
Mp3 mp3 = new Mp3();
mp3.setSid(matcher.group(1));
mp3.setSname(matcher.group(2));
mp3.setAuthor(matcher.group(3));
mp3List.add(mp3);
//for(int j=1;j<=matcher.groupCount();j++){
//System.out.print(" "+j+"--->"+matcher.group(j));
//}
}
}
//System.out.println(matcher.find());
}
}catch(Exception e){
e.printstacktrace();
}
以上是我在项目中解析的东西,使用还是比较简单的,容易上手。
////claStr为bb-dotimg clearfix song-item-hook { 'songItem': { 'sid': '113275822','author': '黄渤
则是从网页中解析到的内容。
您可能感兴趣的文章:
- AndroidHttpClient使用Cookie应用分析
- C# HttpClient Cookie验证解决方法
- Android HttpClient GET或者POST请求基本使用方法
- Android下通过httpClient发送GET和POST请求的实例代码
- java使用httpclient发送post请求示例
- java使用httpclient模拟post请求和get请求示例
- java使用htmlparser提取网页纯文本例子
- Python中使用HTMLParser解析html实例
- 基于Java HttpClient和Htmlparser实现网络爬虫代码
关于使用htmlparser python获取标签下的html和python获取html标签的内容的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于c# – 如何使用htmlagilitypack获取2个周围html元素之间的html?、html.parser - 简单的HTML和XHTML 解析器、Java HtmlParse提取标签中的值操作、java利用htmlparser获取html中想要的代码具体实现的相关知识,请在本站寻找。
本文标签: