XPath (및 HtmlAgilityPack)를 사용하여 HTML 테이블에서 모든 링크를 선택하십시오.

c# html-agility-pack xpath

문제

내가 성취하고자하는 것은 http : //, https : // 또는 /로 시작하는 href 속성을 가진 모든 링크를 추출하는 것입니다. 이러한 링크는 특정 클래스 (tbody> tr> td 등) 내에 있습니다. 나는 전체 요소가없는 요소를 지정할 수 있다고 생각했지만 작동하지 않는 것 같습니다. 링크를 선택하는 줄에서 NullReferenceException이 발생합니다.

var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
    foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
    {
        //not working

XPath에 관한 권장 사항이나 모범 사례에 대해서는 알지 못합니다. 문서를 두 번 쿼리 할 때 오버 헤드가 발생합니까?

수락 된 답변

사용 :

 //tbody/descendant::a[starts-with(@href,'https://')
                     or
                       starts-with(@href,'http://')
                     or
                       starts-with(@href,'./') 
                      ]

XmlNode.SelectNodes() 인스턴스 메서드에 HtmlNode 아닌 XmlNodeList 의 반환 형식이 있다는 사실을 반영하도록 코드를 수정하지 않으면 문제가 계속 발생 합니다.


인기 답변

문제는 당신이 테이블을 선택하고 곧바로 직접 고령자 인 것처럼 앵커를 선택하려고한다는 것입니다. 중간에 trtd 태그가 있습니다.

따라서, xpath를 다음과 같이 변경하면 모든 것이 작동합니다.

"tbody/tr/td/a[starts-with(@href, 'https://')]"

앵커가 다른 것으로 둘러 쌓여 있으면 현재 노드 집합 (예 : 테이블)에있는 앵커를 모두 선택할 수 있습니다.

"tbody/tr/td/a[starts-with(@href, 'https://')]"

xpath 구문에 대한 자세한 내용은 이 부분 을 참조하십시오.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.