试图在C#中使用xpath选择slip hrefy href属性

时间:2019-05-22 22:12:07

标签: c# xpath html-agility-pack

试图从网站上抓取.pdf,但是XPath固执。

Site I'm trying to get the .pdf from

inspect>复制>复制xpath给出的xpath:

//*[@id="content"]/div/table[2]/tbody/tr[0]/td[3]/a

出于某种原因,/tbody除了造成问题外什么也不做。删除它已对我正在使用的所有其他Xpath起作用,并且似乎也是前往此处的方法。

//*[@id="content"]/div/table[2]/tr[0]/td[3]/a

这将产生结果:

<img width="16" height="16" src="/apps/cba/g_doctype_pdf.gif" border="0"><br><small>Download<br>Agreement</small>

哪个似乎是子节点?

无论如何,将xpath备份到:

//*[@id="content"]/div/table[2]/tr[0]/td[3]

得到我

<a target="_blank" href="/apps/cba/docs/1088-CBA6-2017_Redacted.pdf"><img width="16" height="16" src="/apps/cba/g_doctype_pdf.gif" border="0"><br><small>Download<br>Agreement</small></a>

这很好,因为我需要的只是href属性中的值,并且我可以重构URL等等。我不是XPath的向导,但在我看来,这最后的调整应该可以让我得到想要的东西:

//*[@id="content"]/div/table[2]/tr[0]/td[3]/@href

但是它再次返回标签。 我为此感到困惑。有什么建议吗?

编辑:

明显的解决方案使我很清楚自己在做一个假设。我以为我可以取消引用href标签的方式与取消引用其他节点的方式相同。事实并非如此,我不得不调整对以下内容的引用:

var node_collection = hdoc.DocumentNode.SelectNodes(@"//*[@id=""content""]/div/table[2]/tr[1]/td[3]/a/@href");
string output = node[0].Attributes["href"].Value

问题根本不在Xpath上。问题是我对正在处理的HtmlDocument对象缺乏了解。我试图获得href标签的贴士会让所有有经验的人都明白这一点。对复制粘贴我的整个凌乱代码块过于自觉,这使任何人都无法帮助我。从孩子们的失误中学习,健壮的代码部分使准确识别问题变得更加容易。

1 个答案:

答案 0 :(得分:1)

是的,tbody由Chrome在Copy XPath上添加,由于原始HTML代码中不存在href,因此应将其删除。 *

选择//*[@id="content"]/div/table[2]/tr[1]/td[3]/a/@href属性应按建议的方式工作:HtmlWeb web = new HtmlWeb(); HtmlDocument hdoc = web.Load("https://work.alberta.ca/apps/cba/searchresults.asp?query=&employer=&union=&locality=&local=&effective_fy=&effective_fm=&effective_ty=&effective_tm=&expiry_fy=&expiry_fm=&expiry_ty=&expiry_tm="); var nav = (HtmlNodeNavigator)hdoc.CreateNavigator(); var val = nav.SelectSingleNode(@"//*[@id=""content""]/div/table[2]/tr[1]/td[3]/a/@href").Value;

我可以这样加载第一个href:

XPathNavigator nav2 = hdoc.CreateNavigator();
XPathNodeIterator xiter = nav2.Select(@"//*[@id=""content""]/div/table[2]/tr/td[3]/a/@href");
while (xiter.MoveNext())
{
    Console.WriteLine(xiter.Current.Value);
}

或者所有这样的人:

tbody

*但是,确实有一些引擎要求tbody出现在XPath中,如演示的here所示。只有这样我们才能得出结果。请参见this answer,为什么首先由Chrome,Firebug等添加<?php $connection = mysqli_connect("localhost", "root", ""); // Establishing Connection with Server $db = mysqli_select_db($connection, "ofobms"); // Selecting Database from Server // Check connection if (!$connection) { die("Connection failed: " . mysqli_connect_error()); } if (isset($_POST['sub'])) { $checkbox1 = '$_POST[techno]'; $N = count($checkbox1); echo("<p>You selected $N techno(s): "); $stmt = mysqli_prepare($connection, "INSERT INTO order_table (item_ID) values (?)"); mysqli_stmt_bind_param($stmt, "i", $chk1); $success = true; foreach((array) $checkbox1 as $chk1) { if (!mysqli_stmt_execute($stmt)) { $success = false; break; } } if ($success) { echo'<script>alert("Inserted Successfully")</script>'; } else { echo'<script>alert("Failed To Insert")</script>'; } } $sql = "SELECT * FROM menu"; $myData = mysqli_query($connection, $sql); echo "<table border=0 cellpadding=0 cellspacing=0 class=table id=viewmenuitemtable> <tr class=tableheader> <th>cb</th> <th>Item Name</th> <th>Item Price</th> <th>Item Catagory</th> <th>Item Course</th> <th>Item Description</th> </tr>"; while ($record = mysqli_fetch_array($myData)) { echo "<form action=try1.php method=post>"; echo "<tr>"; // echo "<td>" . "<input type=text name=itemID class=td1 table value=" . $record['item_ID'] . " ''</td>"; if ($record['item_amount'] > 0) { // echo "<td>" . "<input type=checkbox name=techno[] </td>"; //echo "<td>" . "<input type=checkbox name=techno[] class=table value=" . $record['item_ID'] . " </td>"; echo "<td>" . "<input type=checkbox name=techno[] class=td2 table >" . $record['item_name'] . "</input> ''</td>"; echo "<td>" . "<input type=text name=techno[] class=td1 table value=" . $record['item_price'] . " ''</td>"; echo "<td>" . "<input type=text name=techno[] class=td2 table value=" . $record['item_catagory'] . " ''</td>"; echo "<td>" . "<input type=text name=techno[] class=td1 table value=" . $record['item_course'] . " ''</td>"; echo "<td>" . "<textarea name=techno[] class=td2 table>" . $record['item_description'] . " </textarea>"; echo "<td>" . "<input type=hidden name=hidden class=table value=" . $record['item_ID'] . " </td>"; } // echo "<td>" . "<input type=submit name=update class=btn btn-primary btn-lg btn-block value=Update" . " </td>"; // echo "<td>" . "<input type=submit name=delete class=btn btn-primary btn-lg btn-block value=Delete" . " </td>"; echo "</tr>"; echo "</form>"; } echo "</table>"; mysqli_close($connection); ?> <form action="try1.php" method="post"> <input type="submit" name="sub" class="btn btn-primary btn-lg btn-block" value="Order"> </form>