2017-03-11 14 views
4

私はAngleSharpを使用してサイトのコンテンツを解析しています。匿名ブロックに問題があります。AngleSharpの無名ブロックからテキストを解析するには?

サンプルコードを参照してください:だから

var parser = new HtmlParser(); 
var document = parser.Parse(@"<body> 
<div class='product'> 
    <a href='#'><img src='img1.jpg' alt=''></a> 
    Hello, world 
    <div class='comments-likes'>1</div> 
</div> 
<div class='product'> 
    <a href='#'><img src='img2.jpg' alt=''></a> 
    Yet another helloworld 
    <div class='comments-likes'>25</div> 
</div> 
<body>"); 

var products = document.QuerySelectorAll("div.product"); 
foreach (var product in products) 
{ 
    var productTitle = product.Text(); 
    productTitle.Dump(); 
} 

を、productTitleはdiv.comments-同類からの数字が含まれている、出力は次のようになります。

こんにちは、世界1

さらに別のHelloWorld 25

私はのようなものを試しましたリンク要素の次の兄弟はdiv.comments-likesであり、無名ブロックではありません。それは示しています

だから、無名ブロックはスキップされます。 :(

私は私の例のために、すべての防止のブロックを削除して見つけた最適な回避策:

product.QuerySelector(".comments-likes").Remove(); 
var productTitle = product.Text().Trim(); 

は無名ブロックからテキストを解析するためのより良い方法です

答えて

2

テキストがTextNodeとしてモデル化されます?ノードののタイプ、コメントノード、処理命令などのタイプです。その結果、NextElementSiblingは、名前に示されているように要素を返すことを意図したため、テキストにはテキストを含めませんでした。

あなたはdivChildNodesを横断して直接製品div内に配置されたテキストノードを取得し、例えば、NodeTypeによってフィルタリングすることができます:

var products = document.QuerySelectorAll("div.product"); 
foreach (var product in products) 
{ 
    var productTitle = product.ChildNodes 
           .First(o => o.NodeType == AngleSharp.Dom.NodeType.Text 
              && o.TextContent.Trim() != ""); 
    Console.WriteLine(productTitle.TextContent.Trim()); 
} 

dotnetfiddle demo

お知らせ改行とのこと要素もテキストノードなので、上のデモでそれらをフィルタリングする必要があります。

+0

ありがとうございます! –

関連する問題