试图从网站上抓取.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标签的贴士会让所有有经验的人都明白这一点。对复制粘贴我的整个凌乱代码块过于自觉,这使任何人都无法帮助我。从孩子们的失误中学习,健壮的代码部分使准确识别问题变得更加容易。
答案 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>
。