- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从外部网站获取产品数据并将其插入特殊表中 - 每个找到的节点元素都需要导入到产品表中产品的适当列中!
它可以很好地查找 1 个产品属性并将其插入表中:
$product_names = $xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' product_description ')]/div/h3/a");
if (!is_null($product_names)) {
foreach ($product_names as $product_name) {
$nodes = $product_name->childNodes;
foreach ($nodes as $node) {
$import_product = 'INSERT INTO product_table (id, product_name) values ("","' . preg_replace('~\\s+\\S+$~', "", strip_tags(trim($node->nodeValue))) . '")';
mysql_query($import_supralift_name);
}
}
}
但是产品有很多属性,所以,我试图获取此产品属性(位于 1 个 html 元素中,因此我需要将其拆分为数组以用于不同的属性):
$types = $xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' product_description ')]/div/a/p");
if (!is_null($types)) {
foreach ($types as $type) {
$nodes = $type->childNodes;
foreach ($nodes as $node) {
list($typee,$power_unit) = explode(' / ', $node->nodeValue);
$import_type = 'INSERT INTO product_table (id, type, power_unit) values ("", "' . strip_tags(trim($typee)) . '", "' . strip_tags(trim($power_unit)) . '")';
mysql_query($import_type);
}
}
}
简而言之 - 我需要从外部网站获取 3 个产品属性(当然,它们更多,只是想找出使其正常工作的最佳解决方案是什么)并将其插入到我的数据库中,例如:
product_name_1 product_type_1 $power_unit_1
...
product_name_X product_type_X $power_unit_X
到目前为止,我尝试将第二个 xpath 部分放入第一个 foreach 中,但它无法按需要工作...我应该尝试使用 xpath 节点制作数组(例如 $prodcuts=array(firstXpathNode, secondaryXpathNode 等..) 并以这种方式工作,还是有更好、更正确的解决方案?
提前 - TXN 获取任何提示...
编辑:以下是我尝试获取数据的示例 HTML,这是针对产品的(每个产品都有此 html 用于显示数据):
<div class="single_product">
<div data-section="featured_image">
<a title="Unique_String" href="#">
<div style="" data-section="image" class="image_in_fixed_ratio_wrapper">
<div class="inner visible">
<img alt="Unique_String" src="image1.jpg" class="" style="">
</div>
</div>
</a>
</div>
<div data-section="data">
<div class="product_description">
<div data-field="description_detail">
<h3><a title="Unique_String" href="#">Product Name<div class="donotwantthistoinclude">New</div></a></h3>
<a title="Unique_String" href="#"><p>Product Type / Product Power Unit</p></a>
<div data-field="price">
<a title="Unique_String" href="#">5,000</a>
</div>
<div data-field="description">
<a title="Unique_String" href="#">
<span>Height (mm)</span> 2344
|
<span>Other attribute 1</span> Duplex
|
<span>Other attribute 2 (kg)</span> 1400
|
<span>Other attribute 3</span> 2014
| <span>Other attribute X (h)</span> 772
<br><span>Location</span> D - 85716
</a>
</div>
</div>
</div>
</div>
</div>
最佳答案
如果将第一个foreach
中的产品名称分离到变量中,则可以根据产品名称构建相对XPATH。我假设页面上的产品名称是唯一的。然后,第二个 XPATH 在页面上查找产品名称,并在元素中进一步向下移动。现在,保证会编写更好的 XPATH 查询来做到这一点,只是我自己还没有达到这种技能水平,但我确实为您提供了一种方法来做到这一点。
因此流程将类似于:
对于每个产品,获取名称,将名称插入新查询中以获取特定产品的类型和功率单位,解析变量,插入数据库。
您正在使用危险且过时的 SQL。请使用较新的 mysqli_* 或 PDO 库通过预准备语句访问数据库。我没有更新您的代码来反射(reflect)这一点,很容易通过 Google 搜索。
不过,我确实在现有 SQL 中插入了 product_name
来说明如何收集所有 3 个字段。
$product_names = $xpath->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' product_description ')]/div/h3/a");
if (!is_null($product_names)) {
foreach ($product_names as $product_name) {
$nodes = $product_name->childNodes;
foreach ($nodes as $node) {
$productName = preg_replace('~\\s+\\S+$~', "", strip_tags(trim($node->nodeValue)));
$xpath_relative = sprintf("//div[contains(concat(' ', normalize-space(@class), ' '), ' product_description ')]/div/h3/a[contains(text(),'%s')]/../../a/p",$productName);
$types = $xpath->query($xpath_relative);
if (!is_null($types)) {
foreach ($types as $type) {
$types_nodes = $type->childNodes;
foreach ($types_nodes as $type_node) {
list($typee,$power_unit) = explode(' \'', $type_node->nodeValue);
// WARNING!!! SQL INJECTION BELOW!!!
$import_type = 'INSERT INTO product_table (id, type, power_unit, product_name) values ("", "' . strip_tags(trim($typee)) . '", "' . strip_tags(trim($power_unit)) . '", "' . $product_name . '")';
mysql_query($import_type);
}
}
}
}
}
}
我已经获取了您的代码并在 PHP Fiddle 中运行它,结果如下。我还根据提供的结构优化了 XPATH 查询,并提供了有关使用 PDO 的建议。只需根据需要填写更多属性即可。我将给您留下完整的代码,包括我使用过的 DOM 和 XPATH 初始化,以便您可以自己修改。
<pre><?php
$domDoc = <<<EOF
<div class="single_product">
<div data-section="featured_image">
<a title="Unique_String" href="#">
<div style="" data-section="image" class="image_in_fixed_ratio_wrapper">
<div class="inner visible">
<img alt="Unique_String" src="image1.jpg" class="" style="" />
</div>
</div>
</a>
</div>
<div data-section="data">
<div class="product_description">
<div data-field="description_detail">
<h3><a title="Unique_String" href="#">Product Name<div class="donotwantthistoinclude">New</div></a></h3>
<a title="Unique_String" href="#"><p>Product Type / Product Power Unit</p></a>
<div data-field="price">
<a title="Unique_String" href="#">5,000</a>
</div>
<div data-field="description">
<a title="Unique_String" href="#">
<span>Height (mm)</span> 2344
|
<span>Other attribute 1</span> Duplex
|
<span>Other attribute 2 (kg)</span> 1400
|
<span>Other attribute 3</span> 2014
| <span>Other attribute X (h)</span> 772
<br /><span>Location</span> D - 85716
</a>
</div>
</div>
</div>
</div>
</div>
EOF;
$dom = new DomDocument();
$dom->loadXML($domDoc);
$xpath = new DomXPath($dom);
$products = [];
$productUniqueQuery = "//div[@data-field='description_detail']/h3/a/@title";
$productUniqueNodes = $xpath->query($productUniqueQuery);
if (!is_null($productUniqueNodes)) {
foreach ($productUniqueNodes as $productUniqueNode) {
$product = [];
$product["unique"] = $productUniqueNode->nodeValue;
$productNameQuery = sprintf("//h3/a[@title='%s']/text()",$product["unique"]);
$productNameNodes = $xpath->query($productNameQuery);
$product["name"] = $productNameNodes[0]->nodeValue;
$productImageQuery = sprintf("//img[@alt='%s']/@src",$product["unique"]);
$productImageNodes = $xpath->query($productImageQuery);
$product["imageURL"] = $productImageNodes[0]->nodeValue;
$productTypeQuery = sprintf("//a[@title='%s']/p/text()",$product["unique"]);
$productTypeNodes = $xpath->query($productTypeQuery);
list($product["type"], $product["powerUnit"]) = explode(" / ", $productTypeNodes[0]->nodeValue);
$productDescriptionQuery = sprintf("//div[@data-field='description']/a[@title='%s']/child::node()",$product["unique"]);
$productDescriptionNodes = $xpath->query($productDescriptionQuery);
$description = "";
foreach ($productDescriptionNodes as $productDescriptionNode) {
$nodeText = preg_replace("/\s*\|/","",trim($productDescriptionNode->nodeValue));
if($nodeText == "" || $productDescriptionNode->nodeType === 3){
continue;
}
$product[$nodeText] = preg_replace("/\s*\|/","",trim($productDescriptionNode->nextSibling->nodeValue));
}
$products[$product["unique"]] = $product;
}
}
try {
$db = new PDO("mysql:host=HOST;dbname=DBNAME;port=3306","USERNAME", "PASSWORD");
}
catch(PDOException $e){
echo "Connection failed: " . $e->getMessage();
exit();
}
$sql = 'INSERT INTO product_table (unique, name, type, power_unit, attr1) values (:unique, :name, :type, :power_unit, :attr1)';
$stmt = $db->prepare($sql);
foreach($products as $product){
$params = [
":unique"=>$product["unique"],
":name"=>$product["name"],
":type"=>$product["type"],
":power_unit"=>$product["powerUnit"],
":attr1"=>$product["Other attribute 1"]
];
var_dump($product);
$stmt->execute($params);
}
?>
</pre>
关于php - 使用 XPATH 节点从产品中获取数据并将其插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45742499/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!