XPath / HtmlAgilityPack : 속성 (href)에 대한 특정 값을 가진 요소 (a)를 찾고 인접한 테이블 열을 찾는 방법은 무엇입니까?

c# html html-agility-pack visual-studio xpath

문제

내가 질문에 언급 한 것을 성취하는 방법을 알 수 없기 때문에 필사적이다. 나는 이미 비슷한 예를 많이 읽었지만 정확한 상황에서 작동하는 것을 찾지 못했습니다. 그래서, 다음 코드를 가지고 있다고 가정 해 봅시다 :

<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>

자, 제가 이미 가지고있는 것은 url-a의 일부입니다. 기본적으로 ID A와 img A를 얻는 방법을 알고 싶습니다. XPath로 "찾기"위해 노력하고 있지만 제대로 작동 할 수는 없습니다. 또한 정보가 전혀 존재하지 않을 수도 있습니다. 이것은 최근의 시도입니다 (진지하게, 나는 여러 가지 방법을 시도하면서 3 시간 이상 동안이 문제를 해결했습니다).

if (htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, 'part-url-a')]") != null)
    string ida = htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, 'part-url-a')]/following-sibling::a").InnerText;

글쎄, 그것은 분명히 지옥으로 잘못되어 누군가가 나를 도울 수 있다면 매우 기뻐할 것입니다. 또한 누군가가 나를 XPath 및 표기법 / 구문을이 예제와 함께 자세히 설명하는 일부 웹 사이트로 안내 할 수 있으면 감사하겠습니다. 책도 환영합니다.

추신 : XPath 없이는 C #에서 Regex 또는 간단한 StreamReader로 내 목표를 달성 할 수 있다는 것을 알고 각 라인에 필요한 내용이 포함되어 있는지 확인하지만 a) 코드가 갑작스러운 줄 바꿈을 할 수 있기 때문에 너무 취약합니다. 그리고 b) 나는이 프로젝트에서 내가하고있는 일에 대해 XPath에 완전히 집착해야한다.

도와 주셔서 미리 감사드립니다.

수락 된 답변

다음 XPath 표현식을 사용하십시오 .

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()

제공된 (기형이지만 수정 된) XML 문서에 대해 평가할 때 :

<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>

원하는 텍스트 노드가 선택됩니다 .

id A

마찬가지로이 XPath 표현식은 다음과 같습니다.

   /*/tr/td[a[@href='url-a']]
                /following-sibling::td[2]
                     /a/text()

동일한 XML 문서 (위)에 대해 평가할 때 다른 원하는 텍스트 노드를 선택합니다 .

img A

XSLT 기반 검증 :

이 변환이 XML 문서 (위) 에 적용될 때 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/tr/td[a[@href='url-a']]
                /following-sibling::td[1]
                     /a/text()"/>

  <xsl:text>&#10;</xsl:text>
  <xsl:copy-of select=
   "/*/tr/td[a[@href='url-a']]
                /following-sibling::td[2]
                     /a/text()"/>
 </xsl:template>
</xsl:stylesheet>

원하는 결과가 생성됩니다 .

id A
img A

인기 답변

일치하지 않는 닫기 td 태그가있는 HTML이 심각하게 손상되었습니다. 제발 그들을 고쳐주세요. 그것은이 마크 업의 추악한 그림입니다.

이것은 Html Agility Pack이 당신이 그것에 던지는 쓰레기를 다룰 수 있기를 바란다. 그래서 여기에 당신이 가지고있는 쓰레기를 분석하고 idimg 값을 href 주어진 방법을 찾아 보자.

class Program
{
    static void Main()
    {
        var doc = new HtmlDocument();
        doc.Load("test.html");
        var anchor = doc.DocumentNode.SelectSingleNode("//a[contains(@href, 'url-a')]");
        if (anchor != null)
        {
            var id = anchor.ParentNode.SelectSingleNode("following-sibling::td/a");
            if (id != null)
            {
                Console.WriteLine(id.InnerHtml);
                var img = id.ParentNode.SelectSingleNode("following-sibling::td/a");
                if (img != null)
                {
                    Console.WriteLine(img.InnerHtml);
                }
            }
        }
    }
}


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