我必须解析一系列网页才能将数据导入应用程序.每种类型的网页都提供相同类型的数据.问题是每个页面的HTML不同,因此数据的位置会有所不同.另一个问题是HTML代码格式不正确,因此无法使用类似XML的解析器.
到目前为止,我能想到的最好的策略是为每种页面定义一个模板,例如:
模板A:
<html>
...
<tr><td>Table column that is missing a td
<td> Another table column</td></tr>
<tr><td>$data_item_1$</td>
...
</html>
Run Code Online (Sandbox Code Playgroud)
模板B:
<html>
...
<ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr>
...
</html>
Run Code Online (Sandbox Code Playgroud)
这样,我只需要对所有的页面一个单独的语法分析器,将每一页,其模板和检索比较$data_item_1$,$data_item_2$等等.不过,这将是大量的工作.你能想到更简单的解决方案吗?任何可以帮助的图书馆?
谢谢
我正在尝试从任意html页面中提取文本.有些页面(我无法控制)有错误的html或脚本,这使得这很困难.此外,我在一个共享的托管环境,所以我可以安装任何python库,但我不能只在服务器上安装我想要的东西.
pyparsing和html2text.py似乎也不适用于格式错误的html页面.
示例URL是http://apnews.myway.com/article/20091015/D9BB7CGG1.html
我目前的实施大致如下:
# Try using BeautifulSoup 3.0.7a
soup = BeautifulSoup.BeautifulSoup(s)
comments = soup.findAll(text=lambda text:isinstance(text,Comment))
[comment.extract() for comment in comments]
c=soup.findAll('script')
for i in c:
i.extract()
body = bsoup.body(text=True)
text = ''.join(body)
# if BeautifulSoup can't handle it,
# alter html by trying to find 1st instance of "<body" and replace everything prior to that, with "<html><head></head>"
# try beautifulsoup again with new html
Run Code Online (Sandbox Code Playgroud)
如果beautifulsoup仍然不起作用,那么我采用一种启发式方法来查看第一个字符,最后一个字符(看看它们是否看起来像是一个代码行#<;然后取一行代码然后检查是否有令牌是英文单词或数字.如果很少的标记是单词或数字,那么我猜这行是代码.
我可以使用机器学习来检查每一行,但这看起来有点贵,我可能需要训练它(因为我不太了解无监督的学习机器),当然也可以写它.
任何建议,工具和策略都是最受欢迎的.此外,我意识到后一部分相当混乱,因为如果我得到一行确定包含代码,我现在扔掉整行,即使行中有少量实际的英文文本.
我刚刚写了一个perl脚本,它登录了我的网上银行,并每天通过电子邮件发送给我我的余额和一个迷你语句.我发现它对跟踪我的财务状况非常有用.唯一的问题是我使用perl和curl编写它并且它非常复杂且难以维护.在我的银行改变他们的网页的几个实例后,我厌倦了调试它以使其保持最新状态.
那么以这样一种易于维护的方式编写这样一个程序的最佳方法是什么?我想在Perl或Java中编写一个很好的精心设计的版本,当银行不可避免地摆弄他们的网站时,它很容易更新.
我正在尝试为各种科学期刊网站组合一个基本的 HTML 抓取工具,特别是尝试获取摘要或介绍性段落。
我目前在做的期刊是 Nature,我一直使用的文章作为我的样本可以在 http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html。
但是,我无法从该页面中提取摘要。我正在搜索<p class="lead">...</p>标签之间的所有内容,但似乎无法弄清楚如何隔离它们。我以为这会很简单
from BeautifulSoup import BeautifulSoup
import re
import urllib2
address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
soup = BeautifulSoup(html)
abstract = soup.find('p', attrs={'class' : 'lead'})
print abstract
Run Code Online (Sandbox Code Playgroud)
使用 Python 2.5,BeautifulSoup 3.0.8,运行它返回“无”。我没有选择使用任何其他需要编译/安装的东西(比如 lxml)。BeautifulSoup 是糊涂了,还是我糊涂了?
我有一些HTML,我需要从页面中提取实际的书面文本。
到目前为止,我已经尝试过使用Web浏览器并呈现页面,然后转到document属性并获取文本。这有效,但仅在支持浏览器的地方(IE com对象)。问题是我希望它也能够在wine下运行,所以我需要一个不使用IE COM的解决方案。
必须有合理的编程方式来做到这一点。
我有一个HTML页面(index.html),以及一个名为images,css,js的文件夹.
现在我必须在WordPress中这样做.是否有任何插件将Html转换为WordPress或任何其他方式在WordPress中执行此操作?请帮帮我..我是WordPress的初学者.
php wordpress content-management-system html-content-extraction
我正在研究一种算法,在给定HTML文件的情况下,它会尝试选择它认为最有可能包含页面大部分内容文本的父元素.例如,它将在以下HTML中选择div"content":
<html>
<body>
<div id="header">This is the header we don't care about</div>
<div id="content">This is the <b>Main Page</b> content. it is the
longest block of text in this document and should be chosen as
most likely being the important page content.</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我想出了一些想法,比如遍历HTML文档树到它的叶子,加上文本的长度,只看到父母给我们的内容比孩子更多的其他文本.
有没有人尝试过这样的东西,或者知道可以应用的算法?它不必是可靠的,但只要它能猜出包含大部分页面内容文本的容器(例如文章或博客文章),那就太棒了.
html screen-scraping text-extraction html-content-extraction
我知道为此目的使用DOM会更好,但让我们尝试以这种方式提取文本:
<?php
$html=<<<EOD
<html>
<head>
</head>
<body>
<p>Some text</p>
</body>
</html>
EOD;
preg_match('/<body.*?>/', $html, $matches, PREG_OFFSET_CAPTURE);
if (empty($matches))
exit;
$matched_body_start_tag = $matches[0][0];
$index_of_body_start_tag = $matches[0][1];
$index_of_body_end_tag = strpos($html, '</body>');
$body = substr(
$html,
$index_of_body_start_tag + strlen($matched_body_start_tag),
$index_of_body_end_tag - $index_of_body_start_tag + strlen($matched_body_start_tag)
);
echo $body;
Run Code Online (Sandbox Code Playgroud)
结果可以在这里看到:http://ideone.com/vH2FZ
如您所见,我收到的文字多于预期.
有一些我不明白的东西,为了获得substr($string, $start, $length)函数的正确长度,我正在使用:
$index_of_body_end_tag - $index_of_body_start_tag + strlen($matched_body_start_tag)
Run Code Online (Sandbox Code Playgroud)
我没有看到这个公式有什么问题.
有人可以建议问题出在哪里吗?
非常感谢大家.
编辑:
非常感谢你们所有人.我脑子里只有一个小虫.在阅读完答案后,我现在明白了问题所在,它应该是:
$index_of_body_end_tag - ($index_of_body_start_tag + strlen($matched_body_start_tag));
Run Code Online (Sandbox Code Playgroud)
要么:
$index_of_body_end_tag - $index_of_body_start_tag - strlen($matched_body_start_tag);
Run Code Online (Sandbox Code Playgroud) 我想知道是否有更好的方法从网页中提取信息,而不是解析我正在搜索的HTML.即:从'imdb.com'中提取电影评级
我目前正在使用IndyHttp组件来获取页面,我正在使用strUtils来解析文本,但内容有限.
delphi parsing information-extraction html-content-extraction
我想从HTML源中提取文本.我正在尝试使用c#和htmlagilitypack dll.
来源是:
<table>
<tr>
<td class="title">
<a onclick="func1">Here 2</a>
</td>
<td class="arrow">
<img src="src1" width="9" height="8" alt="Down">
</td>
<td class="percent">
<span>39%</span>
</td>
<td class="title">
<a onclick="func2">Here 1</a>
</td>
<td class="arrow">
<img src="func3" width="9" height="8" alt="Up">
</td>
<td class="percent">
<span>263%</span>
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
如何从表中获取文本Here 1和Here 2?