是否有一种简单的方法来解析HTML文档并删除除特定表之外的所有内容?

时间:2012-08-13 17:54:56

标签: java c++ python html parsing

我试图将一个快速实用程序打包在一起,该实用程序将从网站的表中读取记录并将它们插入到数据库中。有几个条件:

  1. 该网页的来源是凌乱。很多CSS和Javascript被抛出。 (它是一个内部网站。)
  2. 我知道我想要的桌子的ID。
  3. 一旦我拿到了桌子,我就必须进一步解析这些行,以获得我正在寻找的具体信息。
  4. 这必须在服务器端完成。 (最好是java,python或C ++,虽然如果有另一个特别好的选择,那也很好。)
  5. 所以有人知道一个好的图书馆或实用程序可以“抓住”#34; ID的html元素让我解析它?我知道这是不言而喻的,但我更喜欢一个尽可能快的。

3 个答案:

答案 0 :(得分:1)

jQuery可以通过它的Id来选择一个元素。

请参阅use-jquery-to-extract-data-from-html-lists-and-tables

文章的要点是:

var tableObject = $('#myTable tbody tr').map(function(i) {
  var row = {};

  // Find all of the table cells on this row.
  $(this).find('td').each(function(i) { //do something with each td }

答案 1 :(得分:1)

您可以使用正则表达式:

<table[^>]*id="whatever"[^>]*>(.*?)</table>

然后提取第一组(parens中的匹配部分)并解析出行:

<tr[^>]*>(.*?)</tr>

最后,每行提取单元格:

<td[^>]*>(.*?)</td>

这适用于您提到的任何语言。

答案 2 :(得分:1)

您可以在Python中使用lxml library

#!/usr/bin/env python
import urllib2
from lxml import html # $ apt-get install python-lxml or $ pip install lxml

page = urllib2.urlopen('http://stackoverflow.com/q/11939631')
doc = html.parse(page).getroot()

div = doc.get_element_by_id('question')
for tr in div.find('table').iterchildren('tr'):
    for td in tr.iterchildren('td'):
        print(td.text_content()) # process td

如果你熟悉jQuery;你可以使用pyquery。它在lxml:

之上添加了jQuery接口
#!/usr/bin/env python
from pyquery import PyQuery # $ apt-get install python-pyquery or
                            # $ pip install pyquery

# d is like the $ in jquery
d = PyQuery(url='http://stackoverflow.com/q/11939631', parser='html')
for tr in d("#question table > tr"):
    for td in tr.iterchildren('td'):
        print(td.text_content())

虽然在这种情况下pyquery添加不够。这里只使用lxml

#!/usr/bin/env python
import urllib2
from lxml import html

page = urllib2.urlopen('http://stackoverflow.com/q/11939631')
doc = html.parse(page).getroot()
for tr in doc.cssselect('#question table > tr'):
    for td in tr.iterchildren('td'):
        print(td.text_content()) # process td

注意:最后两个示例枚举#question元素中所有表(不仅仅是第一个)中的行。