使用Javascript从HTML中提取文本

时间:2011-05-22 19:59:12

标签: javascript html html-parsing

我想使用纯Javascript从HTML中提取文本(这适用于Chrome扩展程序)。

具体来说,我希望能够在页面上找到文本并在其后提取文本。

更具体地说,在像

这样的页面上

https://picasaweb.google.com/kevin.smilak/BestOfAmericaSGrandCircle#4974033581081755666

我想找到文字“Latitude”并提取其后的值。 HTML没有结构化的形式。

这是一个优雅的解决方案吗?

5 个答案:

答案 0 :(得分:2)

我认为没有优雅的解决方案,因为正如你所说的HTML没有结构化而且“纬度”和“经度”这两个词取决于页面本地化。 我能想到的最好的是依靠基点,这可能不会改变......

var data = document.getElementById("lhid_tray").innerHTML;
var lat = data.match(/((\d)*\.(\d)*)°(\s*)(N|S)/)[1];
var lon = data.match(/((\d)*\.(\d)*)°(\s*)(E|W)/)[1];

答案 1 :(得分:1)

你可以做到

var str = document.getElementsByClassName("gphoto-exifbox-exif-field")[4].innerHTML;
var latPos = str.indexOf('Latitude')
lat = str.substring(str.indexOf('<em>',latPos)+4,str.indexOf('</em>',latPos))

答案 2 :(得分:1)

您感兴趣的文字位于div,内容为gphoto-exifbox-exif-field。由于这是针对Chrome扩展程序的,因此我们document.querySelectorAll可以轻松选择该元素:

var div = document.querySelectorAll('div.gphoto-exifbox-exif-field')[4],
    text = div.innerText;

/* text looks like:
"Filename: img_3474.jpg
Camera: Canon
Model: Canon EOS DIGITAL REBEL
ISO: 800
Exposure: 1/60 sec
Aperture: 5.0
Focal Length: 18mm
Flash Used: No
Latitude: 36.872068° N
Longitude: 111.387291° W"
*/

现在很容易得到你想要的东西:

var lng = text.split('Longitude:')[1].trim(); // "111.387291° W"

我使用的是trim()而不是split('Longitude: '),因为innerText实际上并不是空格字符(网址编码,它是%C2%A0 ...没时间搞清楚什么映射到,抱歉)。

答案 3 :(得分:0)

我会查询DOM,只是将图像信息收集到一个对象中,这样就可以引用你想要的任何属性。

E.g。

function getImageData() {
    var props = {};
    Array.prototype.forEach.apply(
        document.querySelectorAll('.gphoto-exifbox-exif-field > em'),
        [function (prop) {
            props[prop.previousSibling.nodeValue.replace(/[\s:]+/g, '')] = prop.textContent;
        }]
    );
    return props;
}

var data = getImageData();
console.log(data.Latitude); // 36.872068° N

答案 4 :(得分:0)

如果其他网站需要更一般的答案,那么您可以尝试以下方式:

var text = document.body.innerHTML;
text = text.replace(/(<([^>]+)>)/ig,"");  //strip out all HTML tags
var latArray = text.match(/Latitude:?\s*[^0-9]*[0-9]*\.?[0-9]*\s*°\s*[NS]/gim);
//search for and return an array of all found results for:
//"latitude", one or 0 ":", white space, A number, white space, 1 or 0 "°", white space, N or S
//(ignores case)(ignores multi-line)(global)

对于该示例,返回包含“Latitude:36.872068°N”的1个元素的数组(应该很容易解析)。