2013-10-18 13 views
14
var page = UrlFetchApp.fetch(contestURL); 
var doc = XmlService.parse(page); 

Mã trên cho lỗi phân tích khi được sử dụng, tuy nhiên nếu tôi thay thế lớp XmlService với lớp Xml không dùng nữa, với bộ cờ lenient, nó phân tích cú pháp html đúng.Cách tốt nhất để phân tích cú pháp html trong tập lệnh google apps

var page = UrlFetchApp.fetch(contestURL); 
var doc = Xml.parse(page, true); 

Vấn đề chủ yếu là do không có CDATA trong phần javascript của html và trình phân tích cú pháp phàn nàn với lỗi sau.

The entity name must immediately follow the '&' in the entity reference. 

Thậm chí nếu tôi loại bỏ tất cả các <script>(.*?)</script> sử dụng regex, nó vẫn phàn nàn vì <br> thẻ không được đóng lại. Có cách nào phân tích cú pháp html thành cây DOM hay không.

+0

Xem http://stackoverflow.com/a/1732454/362634 ... –

+0

Bạn có thể tìm nạp trang và sử dụng trình phân tích cú pháp để loại bỏ các thẻ không mong muốn và sau đó bắt đầu phân tích cú pháp khác, có thể thực hiện được. Tôi biết rằng XmlService hoạt động tốt nhưng là loại lỗi. – hwnd

Trả lời

1

Thực sự không có cách nào trừ khi bạn làm những gì bạn đã thử mà sẽ không hoạt động nếu html không phù hợp với định dạng xml.

3

Xml.parse() có tùy chọn bật phân tích cú pháp lenient, giúp phân tích cú pháp HTML. Lưu ý rằng dịch vụ Xml không còn được dùng nữa và phiên bản XmlService mới hơn không có chức năng này.

25

Tôi đã gặp sự cố tương tự chính xác này. Tôi đã có thể phá vỡ nó bằng cách đầu tiên sử dụng phản Xml.parse, vì nó vẫn hoạt động, sau đó chọn XmlElement cơ thể, sau đó đi qua trong chuỗi XML của nó vào XmlService.parse phương pháp mới:

var page = UrlFetchApp.fetch(contestURL); 
var doc = Xml.parse(page, true); 
var bodyHtml = doc.html.body.toXmlString(); 
doc = XmlService.parse(bodyHtml); 
var root = doc.getRootElement(); 

Lưu ý: Giải pháp này có thể không hoạt động nếu cũ Xml.parse bị xóa hoàn toàn khỏi Google Scripts.

+5

Cảm ơn vì mẹo này :) Nó vẫn hoạt động, tính đến tháng 1 năm 2016. –

+0

Điều gì về các tài liệu 'html' có cấu trúc hoàn toàn không xác thực và XmlService.parse chỉ chokes trên chúng? –

+2

doc.html.body là một mảng cho tôi vì một lý do nào đó và mỗi phần tử có vẻ khác nhau –

2

Sử dụng một biểu thức chính quy:

var page = UrlFetchApp.fetch(contestURL); 
var regExp = new RegExp("(pattern)", "gi"); 
var value = regExp.exec(page.getContentText())[1]; // [1] is the match group when using parenthesis in the pattern 
+0

Hàng cuối cùng trả về '' 'null''' cho tôi. –

+0

thường là một ý tưởng rất tồi (tm) để sử dụng regexen để phân tích cú pháp html/xml: https: //blog.codinghorror.com/parsing-html-the-cthulhu-way/ – gorgonzola

2

tôi thấy rằng cách tốt nhất để phân tích cú pháp html trong các ứng dụng google là để tránh sử dụng XmlService.parse hoặc Xml.parse. XmlService.parse không hoạt động tốt với mã html xấu từ các trang web nhất định.

Dưới đây là ví dụ cơ bản về cách bạn có thể phân tích cú pháp bất kỳ trang web nào một cách dễ dàng mà không cần sử dụng XmlService.parse hoặc Xml.parse. Trong ví dụ này, tôi đang lấy danh sách tổng thống từ "wikipedia.org/wiki/President_of_the_United_States" whit một tài liệu javascript thông thường.getElementsByTagName() và dán các giá trị vào bảng tính google của tôi.

1- Tạo trang tính Google mới;

2- Nhấp vào menu Tools> Script editor ... để mở một tab mới với cửa sổ soạn thảo mã và sao chép đoạn mã sau vào Code.gs của bạn:

function onOpen() { 
var ui = SpreadsheetApp.getUi(); 
    ui.createMenu("Parse Menu") 
     .addItem("Parse", "parserMenuItem") 
     .addToUi(); 

} 


function parserMenuItem() { 
    var sideBar = HtmlService.createHtmlOutputFromFile("test"); 
    SpreadsheetApp.getUi().showSidebar(sideBar); 
} 


function getUrlData(url) { 
var doc = UrlFetchApp.fetch(url).getContentText() 
return doc        
} 

function writeToSpreadSheet(data) { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheets()[0]; 
var row=1 

    for (var i = 0; i < data.length; i++) { 
    var x = data[i]; 
    var range = sheet.getRange(row, 1) 
    range.setValue(x); 
    var row = row+1 
    } 
} 

3- Thêm tệp HTML vào dự án Apps Script của bạn. Mở Script Editor và chọn File> New> Html File, và đặt tên là 'test'.Then sao chép đoạn mã sau vào test.html của bạn

<!DOCTYPE html> 
<html> 
<head>  
</head> 
<body> 
<input id= "mButon" type="button" value="Click here to get list" 
onclick="parse()"> 
<div hidden id="mOutput"></div> 
</body> 
<script> 

window.onload = onOpen; 

function onOpen() { 
var url = "https://en.wikipedia.org/wiki/President_of_the_United_States" 
google.script.run.withSuccessHandler(writeHtmlOutput).getUrlData(url) 
document.getElementById("mButon").style.visibility = "visible"; 
} 

function writeHtmlOutput(x) { 
document.getElementById('mOutput').innerHTML = x; 
} 

function parse() { 

var list = document.getElementsByTagName("area"); 
var data = []; 

    for (var i = 0; i < list.length; i++) { 
    var x = list[i]; 
    data.push(x.getAttribute("title")) 
    } 

google.script.run.writeToSpreadSheet(data); 
} 
</script> 
</html> 

4- Lưu gs của bạn và các tập tin html và Quay trở lại vào bảng tính của bạn. Tải lại bảng tính của bạn. Nhấp vào "Parse Menu" - "Parse". Sau đó bấm vào "Click vào đây để có được danh sách" trong thanh bên.

Các vấn đề liên quan