2012-05-14 25 views
5

Nói rằng tôi có một file html mà tôi đã nạp, tôi chạy truy vấn này:PHP XPath: Nhận tất cả của href chứa "chữ"

$url = 'http://www.fangraphs.com/players.aspx'; 
$html = file_get_contents($url);  
$myDom = new DOMDocument; 
$myDom->formatOutput = true; 
@$myDom->loadHTML($html); 
$anchor = $xpath->query('//a[contains(@href,"letter")]'); 

Điều đó mang lại cho tôi một danh sách các neo mà trông giống như sau :

<a href="players.aspx?letter=Aa">Aa</a> 

Nhưng tôi cần một cách để chỉ nhận "players.aspx? Letter = Aa".

tôi nghĩ rằng tôi có thể thử:

$anchor = $xpath->query('//a[contains(@href,"letter")]/@href'); 

Nhưng điều đó mang lại cho tôi một lỗi php nói rằng tôi không thể thêm nút khi tôi thử như sau:

$xpath = new DOMXPath($myDom); 
$newDom = new DOMDocument; 
$j = 0; 
while($myAnchor = $anchor->item($j++)){ 
    $node = $newDom->importNode($myAnchor, true); // import node 
    $newDom->appendChild($node); 
} 

Bất kỳ ý tưởng làm thế nào để có được chỉ giá trị của các thẻ href mà truy vấn đầu tiên chọn ?? Cảm ơn!

+0

này hoạt động mà không cần bất kỳ lỗi cho tôi .. Tôi có thể xem chi tiết của mã này, ví dụ xml đó là DOM cho newDom? –

+0

Vâng, xin lỗi, tôi không rõ ràng.Nó không phải là XML, nó là một tệp HTML được nạp vào. Bạn có thể xem lại bài đăng gốc không? Tôi đã chỉnh sửa phần trên cùng của nó để phản ánh cách tôi có được DOM. – sfgiants2010

+0

Vẫn chưa đủ - bạn đang thiếu nơi 'xpath' và' newDom' được khởi tạo –

Trả lời

0

Truy vấn XPath của bạn tự trả lại thuộc tính (tức là, DOMAttr đối tượng) thay vì các thành phần (tức là, DOMElement đối tượng). Đó là tốt, và đó có vẻ là những gì bạn muốn, nhưng phụ thêm chúng vào tài liệu là vấn đề. A DOMAttr không phải là một nút độc lập trong cây tài liệu; nó được liên kết với một số DOMElement nhưng không phải là con theo nghĩa thông thường. Do đó, việc trực tiếp thêm DOMAttr vào tài liệu không hợp lệ.

Từ the W3C specs:

Attr đối tượng kế thừa giao diện Node, nhưng vì họ không thực sự nút con của phần tử họ mô tả, DOM không coi họ là một phần của cây tài liệu. . . . DOM có quan điểm rằng các thuộc tính được tính chất của các yếu tố hơn là có một bản sắc riêng biệt từ các yếu tố chúng có liên quan với

Hoặc kết hợp DOMAttr với một DOMElement và thêm yếu tố đó, hoặc kéo ra giá trị của DOMAttr và sử dụng như bạn muốn.

Để chỉ thêm giá trị văn bản thuần túy của nó, hãy sử dụng giá trị văn bản của nó trong nút DOMText và thêm vào đó. Ví dụ, thay đổi dòng này:

$newDom->appendChild($node); 

này:

$newDom->appendChild(new DOMText($node->value)); 
0

thử này ..

$xml_string = 'your xml string'; 
$xml = simplexml_load_string($xml_string); 
foreach($xml->a[0]->attributes() as $href => $value) { 
    $myAnchorsValues[] = $value; 
} 

var_dump($myAnchorsValues); 
+0

Thực ra nó không phải là xml ... đó là một tệp HTML được tải vào DOMDocument. Bạn có thể xem lại bài đăng gốc lần nữa không? Tôi đã chỉnh sửa phần trên cùng để bao gồm nơi tôi nhận nội dung từ đó. – sfgiants2010

+0

bạn có thể thử với trình phân tích cú pháp này: http://simplehtmldom.sourceforge.net/ đã làm việc cho tôi. nếu bạn cần một ví dụ cho tôi biết, nhưng nó rất rõ ràng hơn trong tài liệu. – BruneX

3

Sử dụng:

//a/@href[contains(., 'letter')] 

này chọn bất kỳ href thuộc tính của bất kỳ a mà chuỗi giá trị (của thuộc tính) chứa chuỗi "letter".

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